Java: настраиваемая исключительная ошибка - PullRequest
2 голосов
/ 13 апреля 2010
$ javac TestExceptions.java 
TestExceptions.java:11: cannot find symbol
symbol  : class test
location: class TestExceptions
            throw new TestExceptions.test("If you see me, exceptions work!");
                                    ^
1 error

Код

import java.util.*;
import java.io.*;

public class TestExceptions {
    static void test(String message) throws java.lang.Error{
        System.out.println(message);
    }   

    public static void main(String[] args){
        try {
             // Why does it not access TestExceptions.test-method in the class?
            throw new TestExceptions.test("If you see me, exceptions work!");
        }catch(java.lang.Error a){
            System.out.println("Working Status: " + a.getMessage() );
        }
    }
}

Ответы [ 2 ]

5 голосов
/ 13 апреля 2010

TestExceptions.test возвращает тип void, поэтому вы не можете throw его. Чтобы это работало, необходимо вернуть объект типа, который расширяет Throwable.

Один пример может быть:

   static Exception test(String message) {
        return new Exception(message);
    } 

Однако, это не очень чисто. Лучше было бы определить класс TestException, который расширяет Exception или RuntimeException или Throwable, а затем просто throw.

class TestException extends Exception {
   public TestException(String message) {
     super(message);
   }
}

// somewhere else
public static void main(String[] args) throws TestException{
    try {
        throw new TestException("If you see me, exceptions work!");
    }catch(Exception a){
        System.out.println("Working Status: " + a.getMessage() );
    }
}

(Также обратите внимание, что на все классы в пакете java.lang можно ссылаться по их имени класса, а не по полному имени. То есть вам не нужно писать java.lang.)

3 голосов
/ 13 апреля 2010

Рабочий код

Попробуйте это:

public class TestExceptions extends Exception {
    public TestExceptions( String s ) {
      super(s);
    }

    public static void main(String[] args) throws TestExceptions{
        try {
            throw new TestExceptions("If you see me, exceptions work!");
        }
        catch( Exception a ) {
            System.out.println("Working Status: " + a.getMessage() );
        }
    }
}

Проблемы

Существует ряд проблем с кодом, который вы разместили, в том числе:

  • Улов Error вместо Exception
  • Использование статического метода для создания исключения
  • Не распространяется Exception за ваше исключение
  • Не вызывать конструктор суперкласса Exception с сообщением

Опубликованный код решает эти проблемы и отображает то, что вы ожидали.

...