2015-09-03 5 views
7

दौरान पैरामीटर के रूप में किसी सरणी गुजर मैं बहुत मौलिक कुछ याद करना चाहिए। जब मैं किसी विधि आमंत्रण के दौरान किसी भी प्रकार की सरणी पारित करने का प्रयास करता हूं तो मुझे एक त्रुटि मिलती है। हालांकि जब मैं इसे सामान्य रूप से करता हूं तो यह काम करता है।IllegalArgumentException जब विधि मंगलाचरण

यह पूरा कोड है कि विफल रहता है

import java.lang.reflect.Method; 

public class Main { 
    public static void main(String[] args) throws Exception { 

     // Normal 
     MyClass.sayHello(new String[] {"StackOverflow"}); 

     // Reflection 
     Method m = MyClass.class.getMethod("sayHello", String[].class); 
     m.invoke(null, new String[]{"StackOverflow"}); 
    } 

    static class MyClass { 
     public static void sayHello(String[] args) { 
      System.out.println("Hello " + args[0]); 
     } 
    } 
} 

अपवाद फेंक दिया

Exception in thread "main" java.lang.IllegalArgumentException: argument type mismatch 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at Main.main(Main.java:11) 

String... या तो btw काम नहीं करता है।

उत्तर

7

समस्या यह है कि invoke पर दूसरा पैरामीटर तर्कों की एक सरणी के रूप में है - आप केवल एक ही तर्क निर्दिष्ट कर रहे हैं।

ज्यादातर मामलों है कि उचित रहेगा के रूप में Method.invoke का दूसरा पैरामीटर एक varargs पैरामीटर है, लेकिन के रूप में अपने तर्क पहले से ही एक सरणी Object[] के साथ संगत है, संकलक एक आवरण सरणी बनाने नहीं है।

Main.java:11: warning: non-varargs call of varargs method with inexact argument type for 
         last parameter; 
     m.invoke(null, new String[]{"StackOverflow"}); 
        ^
    cast to Object for a varargs call 
    cast to Object[] for a non-varargs call and to suppress this warning 

आप या तो स्पष्ट तर्क लपेटकर एक सरणी बना सकते हैं, या Object को तर्क डाली ताकि संकलक वह खुद को रैप करने के लिए की जरूरत है:

मैं तुम्हें एक संकलन समय इस तरह की चेतावनी पाने के लिए उम्मीद थी
// Creates the wrapper array explicitly 
m.invoke(null, new Object[] { new String[] { "StackOverflow" } }); 

या

// Compiler creates the wrapper array because the argument type is just Object 
m.invoke(null, (Object) new String[] { "StackOverflow" }); 
+0

TLDR: हमेशा की तरह RTFD – mvd

+0

हाँ, मैं एक ही चेतावनी मिल गया। यह कोई समझ नहीं आता है कि जावा को सरणी तर्कों की सरणी की आवश्यकता क्यों होगी, लेकिन यह काम करता है। धन्यवाद! – TomTom

+0

@ टॉमटॉम: यह सही समझ में आता है: इसे एक सरणी की आवश्यकता होती है क्योंकि कई तर्क हो सकते हैं। उस सरणी का एकमात्र तत्व स्वयं एक सरणी है, क्योंकि विधि के पैरामीटर एक सरणी है। विधि में एक और पैरामीटर जोड़ने का प्रयास करें और इससे अधिक समझ आएगी। और भविष्य में, * कभी भी चेतावनियों को अनदेखा न करें :) –

संबंधित मुद्दे