Java.lang.reflect.IvocationTargetException এর কারণ কী হতে পারে?


313

ঠিক আছে, আমি এর কারণ কী হতে পারে তা বোঝার এবং পড়ার চেষ্টা করেছি তবে আমি এটি পেতে পারি না:

আমার কোডে এটি আমার কোথাও রয়েছে:

 try{
 ..
 m.invoke(testObject);
 ..
 } catch(AssertionError e){
 ...
 } catch(Exception e){
 ..
 }

কথাটি হ'ল, যখন এটি কোনও পদ্ধতিটি চালিত করার চেষ্টা করে তবে এটি InvocationTargetExceptionঅন্য কিছু প্রত্যাশিত ব্যতিক্রমের (বিশেষত ArrayIndexOutOfBoundsException) পরিবর্তে ছুড়ে দেয় । যেহেতু আমি আসলে জানি যে কী পদ্ধতিটি আহ্বান জানানো হয়েছে আমি সরাসরি এই পদ্ধতি কোডটিতে গিয়ে লাইনটির জন্য একটি ট্রাই-ক্যাচ ব্লক যুক্ত করেছি যা অনুমান করা হয় ArrayIndexOutOfBoundsExceptionএবং এটি ArrayIndexOutOfBoundsExceptionপ্রত্যাশার মতো ছুঁড়ে দিয়েছে । তবুও এটি যখন উপরে চলে যায় তখন কোনওভাবে InvocationTargetExceptionউপরের কোডে এবং catch(Exception e) ই-তে প্রত্যাশিত পরিবর্তন হয়।InvocationTargetExceptionArrayIndexOutOfBoundsException

কী এমন আচরণের কারণ হতে পারে বা আমি কীভাবে এই জিনিসটি পরীক্ষা করতে পারি?

উত্তর:


333

প্রতিবিম্বের সাথে পদ্ধতিটি কল করে আপনি বিমূর্তির একটি অতিরিক্ত স্তর যুক্ত করেছেন। প্রতিফলন স্তর একটি যে কোন ব্যতিক্রম গোপন InvocationTargetException, আপনি একটি ব্যতিক্রম মধ্যে পার্থক্য বলতে দেয় যা আসলে প্রতিফলন কলে একটি ব্যর্থতা দ্বারা সৃষ্ট (হয়তো আপনার যুক্তি তালিকাটি বৈধ, উদাহরণস্বরূপ ছিল না) এবং পদ্ধতি নামক মধ্যে একটি ব্যর্থতা।

কেবল এর মধ্যে কারণটি আনপ্যাপ করুন InvocationTargetExceptionএবং আপনি আসলটি পেয়ে যাবেন।


4
@ ইউজার ৫৫০৪১৩: ব্যতিক্রম খোলার মাধ্যমে এবং অবশ্যই তা পরীক্ষা করে। আপনি সর্বদা এটি নিজেই ফেলে দিতে পারেন, এবং যদি আপনার প্রয়োজন হয় তবে সেটিকে ধরতে পারেন।
জন স্কিটি

157
"এর মধ্যে কারণটি মোড়ক করা" এর অর্থ কী তা নিয়ে যে কেউ ভাবছেন InvocationTargetException, আমি কেবল আবিষ্কার করেছি যে আপনি যদি এটি ব্যবহার করে মুদ্রণ করে থাকেন তবে exception.printStackTrace()আপনি কেবলমাত্র উপরের অর্ধেক / সাধারণ বিভাগের পরিবর্তে "কারণ দ্বারা:" বিভাগটি দেখুন।
জানুয়ারী

31
"মোড়কানো" সম্পর্কে ব্যাখ্যা যুক্ত করতে আপনি ব্যতিক্রমটি ধরতে পারেন এবং এটিতে getCause () পদ্ধতিটিও ব্যবহার করতে পারেন, যদি ইচ্ছা হয় তবে এটি পুনর্নির্মাণও করা যেতে পারে। এর মতো try {...} catch (InvocationTargetException ex) { log.error("oops!", ex.getCause()) }বা...catch... { throw ex.getCause() }
jcadcell

4
+1 @ এইচ জ্যানার্স এর জন্য you just look at the "Caused By:" section instead of the top half/normal section
জিঞ্জারহিড

1
@ ধেরাজভাস্কার অন্য ব্যক্তির উত্তরগুলি নিজের মতো করে সম্পাদনা করবেন না এবং উদ্ধৃত হয়নি এমন পাঠ্যের জন্য উদ্ধৃতি বিন্যাস ব্যবহার করবেন না। এই সম্পাদনাটি মন্তব্য হিসাবে পোস্ট করা উচিত ছিল।
লার্ন

51

ব্যতিক্রম যদি ছুঁড়ে দেওয়া হয় তবে

InvocationTargetException - যদি অন্তর্নিহিত পদ্ধতিটি ব্যতিক্রম ছুঁড়ে।

সুতরাং যদি পদ্ধতিটি, যে প্রতিচ্ছবি এপিআই সহ আহ্বান করা হয়েছে, একটি ব্যতিক্রম ছোঁড়ে (উদাহরণস্বরূপ রানটাইম ব্যতিক্রম), প্রতিবিম্ব এপিআই ব্যতিক্রমটিকে একটিতে আবৃত করবে InvocationTargetException


দুর্দান্ত ব্যাখ্যা!
গৌরব

আমি যদি অন্তর্নিহিত পদ্ধতিটি ব্যতিক্রম ছুঁড়ে ফেলার আশা করি? আমার কি এই ব্যতিক্রমটি ধরা উচিত এবং কেবল পুনরায় পুনর্বিবেচনা করা উচিত?
jDub9


21

মেথড.নোভোকের জাভাদোক থেকে ()

নিক্ষেপ: ইনভোকেশনটারেজিট এক্সসেপশন - যদি অন্তর্নিহিত পদ্ধতিটি ব্যতিক্রম ছুঁড়ে।

এই ব্যতিক্রমটি ছুঁড়ে ফেলা হয় যদি নামক পদ্ধতিটি ব্যতিক্রম ছুঁড়ে ফেলে।


সুতরাং কল্পনা করুন যে আমার কাছে java.lang.reflect.Proxyমোড়কের কোনও জিনিসকে বাড়িয়ে তোলার উদাহরণগুলির একটি ক্যাসকেড রয়েছে । প্রতিটি Proxyকৃত্রিমভাবে তার নিজস্ব ব্যবহার করে একটি নির্দিষ্ট ব্যতিক্রম (সম্ভবত মোড়ানো বস্তু দ্বারা নিক্ষিপ্ত) পরিচালনা করে InvocationHandler। সঠিক ক্যান্সার হ্যান্ডলার / প্রক্সি পৌঁছানোর আগ পর্যন্ত এই ক্যাসকেডটি ছড়িয়ে দেওয়ার ব্যতিক্রমের জন্য, প্রতিটিটিতে InvocationHandlerআমি ধরব InvocationTargetException, এটি মোড়ক করে ফেলব , মোড়ানো ব্যতিক্রমটি instanceofএটিকে পরিচালনা করার ব্যতিক্রম কিনা তা পরীক্ষা করে দেখব InvocationHandler। যদি এটি একটি না হয় instanceof, তবে আমি মোড়কযুক্ত ব্যতিক্রমটি ফেলে দেব ... তাই না?
আব্দুল

আমি সর্বদা আবদ্ধ ব্যতিক্রম নিক্ষেপ করব।
পিটার লরি

9

যে InvocationTargetExceptionসম্ভবত আপ আপনার মোড়কে হয় ArrayIndexOutOfBoundsException। সেই পদ্ধতিটি কী নিক্ষেপ করতে পারে তা প্রতিবিম্বটি ব্যবহার করার সময় কোনও কথা বলার অপেক্ষা রাখে না - সুতরাং কোনও throws Exceptionপদ্ধতির ব্যবহার না করে সমস্ত ব্যতিক্রম ধরা পড়ে এবং এতে আবৃত থাকে InvocationTargetException


ধন্যবাদ, তবে আমি উদাহরণ (উদাহরণস্বরূপ) এবং (ব্যতিক্রম ই) এর মধ্যে কীভাবে পার্থক্য করব? যদি আমি সবসময় কারণটি আন-র্যাপিংয়ের আগে প্রথমে ইনভোকেশনটারেজেক্সেপশন পেয়ে থাকি তবে প্রতিটি ব্যতিক্রমের মধ্যে আমি কোথায় পার্থক্য করব?
ব্যবহারকারী550413

9

এটি নির্দিষ্ট পদ্ধতিতে কোডের সঠিক লাইনটি মুদ্রণ করবে, যা যখন চাওয়া হয় তখন ব্যতিক্রম উত্থাপন করে:

try {

    // try code
    ..
    m.invoke(testObject);
    ..

} catch (InvocationTargetException e) {

    // Answer:
    e.getCause().printStackTrace();
} catch (Exception e) {

    // generic exception handling
    e.printStackTrace();
}

1
ধন্যবাদ; এটি আমাকে বুঝতে সাহায্য করেছে যে আমার সমস্যাটি প্রতিফলনের মধ্যে নয়, তবে অনুরোধ করা পদ্ধতির মধ্যে ছিল।
হোসে

3

এটি এমন কিছু বর্ণনা করে,

ইনভোকেশনট্রেজএক্সেপশন হ'ল একটি চেক করা ব্যতিক্রম যা একটি অনুরোধ পদ্ধতি বা কনস্ট্রাক্টর দ্বারা ছুঁড়ে দেওয়া ব্যতিক্রমকে আবৃত করে। প্রকাশের ১.৪ হিসাবে, এই ব্যতিক্রমটি সাধারণ উদ্দেশ্যে ব্যতিক্রম-শৃঙ্খলা প্রক্রিয়া অনুসারে পুনঃনির্মাণ করা হয়েছে। "টার্গেট ব্যতিক্রম" যা নির্মাণের সময় সরবরাহ করা হয় এবং getTargetException () পদ্ধতির মাধ্যমে অ্যাক্সেস করা হয় এখন কারণ হিসাবে হিসাবে পরিচিত, এবং থ্রোয়েবল.জেটকোজ () পদ্ধতি, পাশাপাশি পূর্বোক্ত "উত্তরাধিকার পদ্ধতি" এর মাধ্যমে অ্যাক্সেস করা যেতে পারে।


2

আপনি এইভাবে getCause () পদ্ধতি ব্যবহার করে মূল ব্যতিক্রম শ্রেণীর সাথে তুলনা করতে পারেন:

try{
  ...
} catch(Exception e){
   if(e.getCause().getClass().equals(AssertionError.class)){
      // handle your exception  1
   } else {
      // handle the rest of the world exception 
   }
} 

1

আমি একটি ছিল java.lang.reflect.InvocationTargetExceptionএক বিবৃতিতে একটি বহিস্থিত একটি এটির বস্তুর কলিং থেকে ত্রুটি classএকটি ভিতরে try/ catchআমার ব্লক class

এক্সিলিপ ডিবাগারে কোডটি সরাতে এবং লগার স্টেটমেন্টের উপর দিয়ে মাউসটি ঘোরাতে দেখলাম লগারটি objectছিল null(আমার একেবারে শীর্ষে কিছু বাহ্যিক ধ্রুবক ইনস্ট্যান্ট করা দরকার class)।


0

অন্তর্নিহিত পদ্ধতি (প্রতিবিম্ব ব্যবহার করে বলা পদ্ধতি) একটি ব্যতিক্রম ছুঁড়ে ফেললে এই ব্যতিক্রমটি ছুঁড়ে দেওয়া হবে।

সুতরাং যদি পদ্ধতিটি, যে প্রতিচ্ছবি API দ্বারা অনুরোধ করা হয়েছে, একটি ব্যতিক্রম ছোঁড়ে (উদাহরণস্বরূপ রানটাইম ব্যতিক্রম), প্রতিবিম্ব এপিআই ব্যতিক্রমটিকে একটি ইনভোকেশনটারেজিট এক্সসেপশনে আবদ্ধ করবে।


0

আমিও একই সমস্যায় পড়ছিলাম। আমি egetget ()। GetCause () ব্যবহার করেছিলাম তখন আমি দেখতে পেলাম যে এটি ভুল পরামিতিগুলির মধ্য দিয়ে যাচ্ছিলাম। প্যারামিটারগুলির একটির মান আনতে নালপয়েন্টার এক্সেকশন ছিল। আশা করি এটা তোমাকে সাহায্য করবে।


-2
  1. এক্সিলিপ নেভিগেটর মোড থেকে সমস্ত জার ফাইল তালিকাভুক্ত করুন
  2. সমস্ত জার ফাইলগুলি বাইনারি মোডে রয়েছে তা যাচাই করুন

4
ন্যাভিগেটরে দেখে আপনি কীভাবে জার ফাইলগুলি বাইনারি মোডে যাচাই করেছেন?
উইলিয়াম

@ উইলিয়াম আপনি আমাকে হাসাহাহালেন হা হা হা। এই লোকটির উত্তরটি হ্রাস করা উচিত।
করিম মানাউল

-7

আমি ক্লিন-> রান এক্সডোকলেট-> এক্সপ্যাকেজিং চালানোর পরে ত্রুটিটি অদৃশ্য হয়ে গেছে।

আমার কর্মক্ষেত্রে, একলিপসে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.