Это мой метод класса Person() inputPersonInfo():

        Scanner sc = new Scanner(System.in);
        System.out.println("Input Information of Person");
        System.out.println("Please input name");
        name = checkInputString();
        System.out.println("Please input address");
        address = checkInputString();
        System.out.println("Please input salary");
        salary = checkInputSalary();        
        return new Person(name,address,salary);
        
        }

Это моя проверка метода ввода:

    public static String checkInputString() {
       //loop until user input true value
        while (true) {
            String s = in.nextLine();
            if (s.isEmpty()) {
                System.err.println("Not empty.");
            } else {
                return s;
            }
        }
    }
    // check if salary is smaller than 0
    public static double checkInputSalary() {
       //loop until user input true value        
        while (true) {
            try {
                double salary = Double.parseDouble(in.nextLine());
                if (salary < 0) {
                    System.err.println("Salary is greater than zero");
                    System.out.print("Please input salary: ");
                } else {
                    return salary;
                }
            } catch (NumberFormatException ex) {
                System.err.println("You must input digidt.");
                System.out.print("Please input salary: ");
            }
        }
    }

Как я могу выдать исключение в этом методе без использования вышеуказанного метода проверки ввода ()?

public Person inputPersonInfo (String name, String address, Double salary) throws Exception {} 

Это мой основной класс (), нужно ли мне вызывать какое-либо исключение в моем основном классе?:

        
        System.out.println("=====Management Person programer=====");        
        
        //call constructor Person
        Person p = new Person(); 
        //enter 3 person 
        for (int i =0; i< 3 ;i++){           
           persons[i] = p.inputPersonInfo(p.getName(), p.getAddress(), p.getSalary());
        }
-1
Manh Pham 18 Янв 2022 в 10:22
Не понятно, что вы спрашиваете. Пожалуйста, объясните подробнее.
 – 
tgdavies
18 Янв 2022 в 10:39
Я использую метод checkinputSalary(), чтобы проверить, не является ли оклад String двойным, меньше 0, он будет печатать «ошибку» и цикл до тех пор, пока пользовательский ввод не будет правильным, затем я вызываю его в inputPersonInfo (String String Double), чтобы проверить , но теперь мой учитель требует, чтобы я использовал inputPersonInfo(String String Double) throws Exception{}, поэтому я больше не могу использовать внешний метод
 – 
Manh Pham
18 Янв 2022 в 10:45
Что должно означать исключение для вызывающего абонента? обычно вы должны сначала создать новый класс исключения (public class MyException extends Exception { ... } - используя соответствующее имя), а затем вы можете использовать throw new MyException("some description of what went wrong");
 – 
user16320675
18 Янв 2022 в 11:56

3 ответа

throws Exception используется при определении метода, чтобы сигнализировать о том, что этот метод может вызвать ошибку, если что-то пойдет не так. Это просто сигнал, он ничего не обрабатывает.

В случае, если вы добавите это в объявление метода, где бы вы ни вызывали этот метод, вам потребуется (IDE, компилятор...) добавить механизмы обработки, такие как предложение try-catch, или добавить еще один throws Exception к объявлению метода, вызывающего ваш «опасный» метод.

Примере:

public void dangerousMethod() throws Exception, RuntimeException // Or whatever other exception
{
    throw new Exception("FAKE BUT DANGEROUS");
}
public void anotherMethod()
{
    dangerousMethod(); // <------------ Compiler, IDE will complain that this should be handled in some way
    
    
    // Either add try catch:
    
    try
    {
        dangerousMethod();
    }
    catch(Exception e) // Or whatever specific Exception you have
    {
        // Handle it...
    }
    
    
    // Or add the throws Exception at the head of the anotherMethod()
}
1
Renis1235 18 Янв 2022 в 10:59

Для непроверенного исключения:

NumberFormatException – это RuntimeException, то есть "непроверенное исключение", что означает, что даже если вы не try...catch его, оно в конечном итоге будет выброшено наружу (вызывающему).

Снаружи (вызывающий) вы можете try...catch его, если хотите, или можете игнорировать его. Если произойдет исключение, оно будет выброшено. Если ваша программа является консольной, она будет запущена и отображена в окне консоли.

Это также означает, что вашему методу main не нужно явно try..catch или throws его, и компилятор все равно успешно скомпилирует его.

Для отмеченного исключения:

С другой стороны, о «проверенном исключении» вы должны try..catch иначе компилятор покажет вам ошибки. Если вы не хотите использовать try...catch исключение в текущем методе, вы можете использовать throws Exception в сигнатуре метода. Например, с IOException:

public Person inputPersonInfo (String name, String address, Double salary) throws IOException {}

В вашем методе main, который вызывает вышеуказанный inputPersonInfo(), вы должны try..catch или throws его в сигнатуре основного метода.

Например: с IOException (проверяемое исключение)

public static void main(String[] args) throws IOException {
    ...
    inputPersonInfo(...);
    ...
}
1
Long Nguyen 18 Янв 2022 в 11:10
Tôi nói tiếng việt để dễ hiểu hơn, vật nếu không dùng cái try... catch thì nó chỉ lặp lại 1 lần hay là có thể lặp lạni đưủn đưủn
 – 
Manh Pham
18 Янв 2022 в 11:10
1
Lặp lại nhiều lần được nhé. Trừ khi nó bị try...catch, còn không cứ throws liên tục ra ngoài, ngay cả thằng main cũng throws ra được, khi đấy Исключение sợra đhiẰẽ консоль
 – 
Long Nguyen
18 Янв 2022 в 11:13
Английский для моего комментария выше (извините, я не могу отредактировать его через 5 минут): Да, мы можем бросать исключение из метода в метод, пока мы не захотим его try...catch, и даже мы не хотим поймать его, мы также можем выбросить его за пределы метода main.
 – 
Long Nguyen
18 Янв 2022 в 11:21

Создайте метод, чтобы исключения не вызывались для начала:

public double getSalaryFromUser() {
    String salary = "";
    while (salary.isEmpty()) {
        System.out.print("Please enter a Salary amount: --> ");
        salary = in.nextLine();
        /* Input Validation:
           The RegEx below used as argument for  the String#matches() 
           method checks to see if the supplied string is a unsigned
           Integer or floating point numerical value. If anything other 
           than that is supplied then the error message is displayed. 
           The second condition checks to see if the value is greater 
           than 0.9d             */ 
        if (!salary.matches("\\d+(\\.\\d+)?") || Double.valueOf(salary) < 1.0d) {
            System.out.println("Invalid Entry (" + salary + ")! You must supply a");
            System.out.println("numerical value and it must be greater than zero.");
            System.out.println("Try again...");
            System.out.println();
            salary = "";
        }
    }
    return Double.parseDouble(salary);
}
0
DevilsHnd 18 Янв 2022 в 11:31