Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Логическая ошибка в исключениях


Автор: Syltan 18.6.2010, 14:21
Вот написал код:

Код

package u;
public class Main {
final private static int N = 50;
    final private static java.io.BufferedReader jin =
        new java.io.BufferedReader(new java.io.InputStreamReader(System.in));

    private static double min_rad(double x[], double y[], int n)  {
        double min = 0;
        double temp;
        int i;
                for (i = 0; i < n; i++)
               //Если значание темп больше минимума
            if ((temp = Math.sqrt(x[i] * x[i] + y[i] * y[i])) > min)
                    //Тогда минимуму присвоить темп
            min = temp;
        return min; //Вызвать минимум и передать аргументом функции
    }
    public static void main(String[] args) throws java.io.IOException,MyException {
        int n;
            //Объявляю 2 масива которыее могут содержать
            //не более 50 действительных чисел каждый
        double x[] = new double[N],
               y[] = new double[N];
        double radius;
        int i;

        System.out.print("Input n: ");
            //Здесь происходит ввод количества натуральных чисел
        n = Integer.parseInt(jin.readLine());
            //Цикл нужен для того, чтоб каждое число мы вводили с клавиатуры
            try{
        for (i = 0; i < n; i++)
        {
         System.out.print("Input x[" + i + "]: ");
         String str1 = jin.readLine();
                String str2 = jin.readLine();
                if(str1.equals(".") || str1.equals("0")){
                    throw new MyException("Ошибка, вы ввели неверные данные");
                }
                if(str2.equals(".") || str2.equals("0")){
                    throw new MyException("Ошибка, вы ввели неверные данные");
                }

                x[i] = Double.parseDouble(str1);
            System.out.print("Input y[" + i + "]: ");

                y[i] = Double.parseDouble(str2);

        }
            //Вызываю функцию min_rad и присваиваю её значение перменной radius
            radius = min_rad(x, y, n);
            //Вывожу радиус найменьшего круга
            System.out.print("Minimum radius: " + radius);
            }catch(MyException m){
                System.out.println(m.getMessage());
            }

    }

}



Код

package u;
public class MyException extends Exception{
public MyException(){
    super();
};

public MyException(String msg)
{
    super(msg);
};

}



Программа компилируется, но если ввести вначале цифру 2, а затем какую-то цифру программа выбрасывает исключение, не то которое я написал ,а вообще даже если вветси цифру программа выбрасывается.

Автор: jk1 18.6.2010, 14:40
Может быть так?
Код

 public static void main(String[] args) throws java.io.IOException {
        int n;
        double min = 0;
        double temp;
        System.out.print("Input n: ");
        //Здесь происходит ввод количества натуральных чисел
        try {
            try {
                n = Integer.parseInt(jin.readLine());
            } catch (NumberFormatException e) {
                throw new MyException("Ошибка, вы ввели неверные данные");
            }
            //Цикл нужен для того, чтоб каждое число мы вводили с клавиатуры
            for (int i = 0; i < n; i++) {
                System.out.print("Input x[" + i + "]: ");
                String str1 = jin.readLine();
                System.out.print("Input y[" + i + "]: ");
                String str2 = jin.readLine();
                double x;
                double y;
                try {
                    x = Double.parseDouble(str1);
                    y = Double.parseDouble(str2);
                } catch (NumberFormatException e) {
                    throw new MyException("Ошибка, вы ввели неверные данные");
                }
                if ((temp = Math.sqrt(x * x + y * y)) > min)
                    //Тогда минимуму присвоить темп
                    min = temp;
            }
            System.out.print("Minimum radius: " + min);
        } catch (MyException m) {
            System.out.println(m.getMessage());
        }
    }
}

Автор: Syltan 18.6.2010, 14:59
Скажите пожалуста, как в этот код добавить ещё  finally

Автор: jk1 18.6.2010, 15:12
Код

...
catch (MyException m) {
     System.out.println(m.getMessage());
}finally{
     // еще какие-то действия
}
...

Автор: Syltan 18.6.2010, 15:40
Пробую так, что-то не компилится.
Код

//Программа с использованием исключений
package u;
public class Main {
final private static int N = 50;
    final private static java.io.BufferedReader jin =
        new java.io.BufferedReader(new java.io.InputStreamReader(System.in));

    private static double min_rad(double x[], double y[], int n)  {
        double min = 0;
        double temp;
        int i;
                for (i = 0; i < n; i++)
               //Если значание темп больше минимума
            if ((temp = Math.sqrt(x[i] * x[i] + y[i] * y[i])) > min)
                    //Тогда минимуму присвоить темп
            min = temp;
        return min; //Вызвать минимум и передать аргументом функции
    }
        
    public static void main(String[] args) throws java.io.IOException,MyException {
        int n;
        double min = 0;
        double temp;
        System.out.print("Input n: ");
        //Здесь происходит ввод количества натуральных чисел
        try {
            try {
                //Здесь если мы ввели число n неверно, тогда сработает NumberFormatException
                n = Integer.parseInt(jin.readLine());
                //Проверяет является ли строка введённая числом
            } catch (NumberFormatException e) {
                throw new MyException("Ошибка, вы ввели неверные данные");
            }
            //Цикл нужен для того, чтоб каждое число мы вводили с клавиатуры
            for (int i = 0; i < n; i++) {
                System.out.print("Input x[" + i + "]: ");
                String str1 = jin.readLine();
                System.out.print("Input y[" + i + "]: ");
                String str2 = jin.readLine();
                double x;
                double y;
                try {
                //Если мы ввели не число тогда тоже ошибка
                //потому что х и у не может содержать строку так как оно типа double
                    x = Double.parseDouble(str1);
                    y = Double.parseDouble(str2);
                } catch (NumberFormatException e) {
                    throw new MyException("Ошибка, вы ввели неверные данные");
                }
                if ((temp = Math.sqrt(x * x + y * y)) > min)
                    //Тогда минимуму присвоить темп
                    min = temp;
            }
            System.out.print("Minimum radius: " + min);
        } catch (MyException m) {
            System.out.println("Очень плохо");
        }{
         finally{  System.out.println(m.getMessage()};
         }
       }
}



Добавлено через 5 минут и 58 секунд
Ещё, если можно растолкуйте что означает вот это действие 
Код

m.getMessage()


Откуда куда попадают данные?

Автор: jk1 18.6.2010, 15:53
Проблема вот в этом куске кода
Код

catch (MyException m) {
            System.out.println("Очень плохо");
        }{
         finally{  System.out.println(m.getMessage()};
         }
       }

Не компилируется по двум причинам:
1) Лишние скобки вокруг finally-блока
2) В finally-блоке нет переменной m, она доступна только в catch-блоке

Цитата

Откуда куда попадают данные?

При создании исключения в его конструктор передается сообщение
Код

new MyException("Ошибка, вы ввели неверные данные");

которое затем можно получить методом getMessage()

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)