2016-02-10 3 views
3

Сначала я начал программировать в колледже и учился vb.net. Теперь я решил сделать переход на Java и задать несколько запросов. В Visual Basic, оператор попытки поймать выложен следующийJava Try Catch block

try 
Catch ex as exception 
finally 
End catch 

но с сайта Java (https://docs.oracle.com/javase/tutorial/essential/exceptions/putItTogether.html) я обнаружил, что в Java используется два уловов, как так:

try { 

} catch (ExceptionType name) { 

} catch (ExceptionType name) { 

} 

я надеялся кто-то может объяснить, почему вам нужно два улова в java и что делают соответствующие уловы.

Спасибо.

+1

Блок кода может генерировать N типов исключений, и вы можете определить различные потоки для различных исключений. – kosa

+1

Два улова не могут быть одним и тем же типом исключения (это была бы ошибка времени компиляции) - они должны быть разных типов, которые вы бы хотели обрабатывать по-разному. –

+0

Вы не * нуждаетесь * два. У вас может быть 1 ..N уловов, которые поймают другой тип исключения. –

ответ

6

В Java, вы может использовать несколько catch блоков.

Это не обязательно означает, что вам нужно.

Это зависит от кода вашего иметь в try блоке, и сколько проверено Exception S это потенциально может бросить (или даже непроверенные Exception сек, если вы действительно хотите, чтобы поймать, что, как правило, у вас нет и вы не :).

Один плохо практика заключается в использовании одного обработчика для общего Exception (или хуже, Throwable, который также будет поймать RuntimeException с и Error ы):

try { 
    // stuff that throws multiple exceptions 
} 
// bad 
catch (Exception e) { 
    // TODO 
} 

хорошая практика поймать все потенциально выброшенные провереноException s.

Если некоторые из них связаны с точки зрения наследования, всегда поймать дочерние классы первыми (т.е. более конкретных Exception с), чтобы ваш код не будет компилироваться:

try { 
    // stuff that throws FileNotFoundException AND IOException 
} 
// good: FileNotFoundException is a child class of IOException - both checked 
catch (FileNotFoundException fnfe) { 
    // TODO 
} 
catch (IOException ioe) { 
    // TODO 
} 

Также обратите внимание на Java 7-х multi-catch blocks, где несвязанные Exception s можно поймать сразу с | разделителем между каждым Exception типа:

try (optionally with resources) { 
    // stuff that throws FileNotFoundException and MyOwnCheckedException 
} 
// below exceptions are unrelated 
catch (FileNotFoundException | MyOwnCheckedException e) { 
    // TODO 
} 

Примечание

В this примере вы связаны, первый фрагмент кода ниже Собираем все вместе может, возможно, следует рассматривать как неоптимальной: она делает поймать потенциально брошенные Exception с, но один из них является IndexOutOfBoundsException , который является RuntimeException (непроверенным) и не должен обрабатываться теоретически.

Вместо этого, SIZE переменных (или скорее константа) должны быть заменена ссылкой на размер List итерируемые, т.е. list.size(), с тем чтобы предотвратить IndexOutOfBoundsException от быть выброшены.

Я предполагаю, что в данном случае это просто пример.

+0

Спасибо! Очень короткий и ясный ответ. – User59

+0

@ М.Хасан, пожалуйста! – Mena

2

Код, который находится на странице, находящейся в ссылке, я изменил ее с единственным исключением. Проблема здесь в том, что в этом случае вы не будете в состоянии знать, что исключение, где связано ли

IndexOutOfBoundsException или IOException

только вы знаете, что происходит исключение

import java.io.*; 

import java.util.List; 
import java.util.ArrayList; 

public class ListOfNumbers { 

    public static void main(String... s) { 
     ListOfNumbers lon = new ListOfNumbers(); 
     lon.writeList(); 
    } 

    private List<Integer> list; 
    private static final int SIZE = 10; 

    public ListOfNumbers() { 
     list = new ArrayList<Integer>(SIZE); 
     for (int i = 0; i < SIZE; i++) { 
      list.add(new Integer(i)); 
     } 
    } 

    public void writeList() { 
     PrintWriter out = null; 

     try { 
      System.out.println("Entering" + " try statement"); 

      out = new PrintWriter(new FileWriter("e://OutFile.txt")); 
      for (int i = 0; i < SIZE; i++) { 
       out.println("Value at: " + i + " = " + list.get(i)); 
      } 
     } catch (Exception e) { 
      System.err.println("Caught Exception: " + e.getMessage()); 

     } finally { 
      if (out != null) { 
       System.out.println("Closing PrintWriter"); 
       out.close(); 
      } else { 
       System.out.println("PrintWriter not open"); 
      } 
     } 
    } 
} 

Пусть мы понимаем концепцию, лучше знать, почему код не удается из-за какого конкретного типа исключения, будь то

IndexOutOfBoundsException или IOException

Теперь Кодекс с обработкой различных исключений

import java.io.*; 

import java.util.List; 
import java.util.ArrayList; 

public class ListOfNumbers { 

    public static void main(String... s) { 
     ListOfNumbers lon = new ListOfNumbers(); 
     lon.writeList(); 
    } 

    private List<Integer> list; 
    private static final int SIZE = 10; 

    public ListOfNumbers() { 
     list = new ArrayList<Integer>(SIZE); 
     for (int i = 0; i < SIZE; i++) { 
      list.add(new Integer(i)); 
     } 
    } 

    public void writeList() { 
     PrintWriter out = null; 

     try { 
      System.out.println("Entering" + " try statement"); 

      out = new PrintWriter(new FileWriter("e://OutFile.txt")); 
      for (int i = 0; i < SIZE; i++) { 
       out.println("Value at: " + i + " = " + list.get(i)); 
      } 
     } catch (IndexOutOfBoundsException e) { 
      System.err.println("Caught IndexOutOfBoundsException: " + 
           e.getMessage()); 

     } catch (IOException e) { 
      System.err.println("Caught IOException: " + e.getMessage()); 

     } finally { 
      if (out != null) { 
       System.out.println("Closing PrintWriter"); 
       out.close(); 
      } else { 
       System.out.println("PrintWriter not open"); 
      } 
     } 
    } 
} 

Здесь мы могли бы знать, что ли удается из-за создания файла на месте

е : //OutFile.txt Привод Not в моей системе

ошибка печатается как

Caught Исключение: е: \ outfile.txt (система не может найти путь указано) Ввод попытка заявление PrintWriter не открыть

Следующий случай

Теперь, когда Я прокомментирую строку

list.add (новое целое число (i));

import java.io.*; 
import java.util.List; 
import java.util.ArrayList; 

    public class ListOfNumbers { 

     public static void main(String... s) { 
      ListOfNumbers lon = new ListOfNumbers(); 
      lon.writeList(); 
     } 

     private List<Integer> list; 
     private static final int SIZE = 10; 

     public ListOfNumbers() { 
      list = new ArrayList<Integer>(SIZE); 
      for (int i = 0; i < SIZE; i++) { 
       // list.add(new Integer(i)); 
      } 
     } 

     public void writeList() { 
      PrintWriter out = null; 

      try { 
       System.out.println("Entering" + " try statement"); 

       out = new PrintWriter(new FileWriter("OutFile.txt")); 
       for (int i = 0; i < SIZE; i++) { 
        out.println("Value at: " + i + " = " + list.get(i)); 
       } 
      } catch (IndexOutOfBoundsException e) { 
       System.err.println("Caught IndexOutOfBoundsException: " + 
            e.getMessage()); 

      } catch (IOException e) { 
       System.err.println("Caught IOException: " + e.getMessage()); 

      } finally { 
       if (out != null) { 
        System.out.println("Closing PrintWriter"); 
        out.close(); 
       } else { 
        System.out.println("PrintWriter not open"); 
       } 
      } 
     } 
    } 

тогда ясно говорит, что он не для индекса из связанного исключения

Ввод попытка заявление Поймали IndexOutOfBoundsException: Индекс: 0, Размер: 0 Закрытие PrintWriter

Поэтому для правильной и эффективной отладки приложения это хорошо.

Я создал условия для другого типа исключения

NoClassDefFoundError 

java.lang.NoClassDefFoundError: ListOfNumbers 
Caused by: java.lang.ClassNotFoundException: stackprac.ListOfNumbers 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248) 
Exception in thread "main" Process exited with exit code 1. 
+0

Спасибо за ответ. – User59

+0

@ M.Hasan Добро пожаловать – SarthAk