eugene_leshchinskiy
@eugene_leshchinskiy

Стоит использовать исключения или if/else?

Всем привет! Скиньте пожалуйста где почитать/посмотреть в каких ситуациях использовать исключения и как это влияет на производительность. А то не совсем понимаю, зачем, например, использовать такое:
public int hashCode() {
        try {
            return name.hashCode();
        }
        catch (NullPointerException exception){
            return 0;
        }
    }

Если можно обойтись этим?
public int hashCode() {
        return (name!=null)?name.hashCode():0;
    }

Спасибо!
  • Вопрос задан
  • 408 просмотров
Решения вопроса 1
Winsik
@Winsik
сис.админ, недопрограммист :)
примеры не равнозначные
1. возникает ошибка в случаях когда "упс" , что быть даже в теории не должно. (то есть эта ошибка для программиста, а не пользователя)
2. тут вы даже не узнаете о том, что "что-то пошло не так" или вам придётся уровнем выше делать проверку на 0 ответ и на него реагировать
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
Losted
@Losted
Software Architect
Второй вариант лучше как с точки зрения читаемости и здравого смысла, так и с точки зрения производительности: jvm не придется делать обход фрэймов чтобы создать стек-трейс, как минимум.
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev
software engineer
Это не сравниваемые вещи.

if/else проверяет ошибку в указанном месте.

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

То есть, если вы где-то забыли проставить if/else, результат будет внезапное завершение программы.
exception можно поставить на самом высоком уровне, и добиться, что будет закрыто какое-то конкретное окно, не будет выполнена какая-то конкретная операция, но приложение останется работать и выполнять другие функции.

Зависит от того, что вы делаете. Если игрушку на 2 кнопки - то можно и без exceptionов, если же многопользовательское приложение, где из-за непредусмотренного действия одного юзера, упадет все приложение для всех пользователей - if/else будет явно недостаточно.
Ответ написан
Комментировать
@bromzh
Drugs-driven development
Скиньте пожалуйста где почитать/посмотреть


Кей Хорстманн, Гари Корнелл "Java. Библиотека профессионала". 9 издание. Том 1. Глава 11.

В частности, там есть раздел с заголовком "Рекомендации по обработке исключений", где всё доходчиво объяснено.
Ответ написан
Комментировать
compilator
@compilator
Senior Data Engineer
Первый вариант как-то попахивает идиотизмом. А откуда он ?
Ответ написан
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Господа, что-то в разум не возьму... Всегда сам считал, что Exception - зло, а тут решил проверить. Я понимаю, что JVM может чего и оптимизнула...

Упс! Все встало на свои места!
IF execution time: 1231
EXCEPT execution time: 1260

package jtests;

import java.util.HashMap;

public class MyTest2 {

	String testIf(HashMap<String, String> h, int i) {
		String r = "None";
		if(h.containsKey("NONEKEY")) {
			r = h.get("NONEKEY");
		}
		return r;
		
	}
	String testExept(HashMap<String, String> h, int i) {
		String r = "None";
		try {
			r = h.get("NONEKEY");
		} catch(Exception e) {
			return e.getMessage();
		}
		return r;
		
	}
	public static void main(String[] args) {
		MyTest2 m = new MyTest2();
		HashMap<String, String> h = new HashMap<String, String>();
		h.put("KEY", "VALUE");
		
		long startTime = System.currentTimeMillis();
		for (int i = 0; i < 900000000; i++) {
		  m.testIf(h,i);
		}
		long endTime = System.currentTimeMillis();
		System.out.println("IF execution time: " + (endTime - startTime) );
		
		startTime = System.currentTimeMillis();
		for (int i = 0; i < 900000000; i++) {
		  m.testExept(h,i);
		}
		endTime = System.currentTimeMillis();
		System.out.println("EXCEPT execution time: " + (endTime - startTime) );
	}

}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы