2015-08-18 3 views
0

Итак, у меня есть программа, которую я хочу проверить, если набор шнуров находится внутри игрового поля, а если нет, то чтобы выбросить ошибку, но продолжайте с программой. Вот код используется (я не беспокоюсь об именах классов/пакетов):Бросьте исключение и НЕ завершайте программу в java

package routines; 

import java.util.Random; 

import game.GameBoard; 
import game.Player; 

public class MovePlayer extends Routine { 
final protected int destX; 
final protected int destY; 

public MovePlayer(int destX, int destY, GameBoard board) { 
    super(); 
    if(destY > board.getHeight() || destX > board.getWidth()) { 
     fail(); 
     throw new RuntimeException(">>> Error while creating routine, one or more coords are outside of the game board"); 
    } else { 
     this.destX = destX; 
     this.destY = destY; 
    } 
} 

А вот ссылка на супер класс (много кода, не уверен, если я должен поставить все это в здесь) Super class SRC

EDIT: Не уверен, что если это будет исправить то, что я хотел, но все, что я делал, было удалить final ключевое слово из переменных

EDIT # 2: Так что я, наконец поняли, что я делал неправильно. 1) переменные были отмечены как окончательные. 2) Это был мой другой код, который вызывал это. * facepalm * Весь мой код был перенесен в новый репозиторий Git, поэтому, если вам следует это сделать, вы можете посмотреть, что я здесь сделал: VI-Arena Git repository

+4

Пожалуйста, проверьте, как использовать [ 'try' блок] (https://docs.oracle.com/javase/tutorial/essential/exceptions/try.html). –

+0

Исключение будет выбрано и должно быть уловлено классом, пытавшимся создать объект MovePlayer. В этом классе вы должны использовать блок «try ... catch», как упомянуто Luiggi – Barranka

+0

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

ответ

0

Я понял, что и как делать то, что мне нужно. То, что мне нужно было остановить создание обычного объекта, если условия были выполнены, и это было сделано путем выброса ошибки. Это было сделано, но я ошибочно установил переменные INSIDE в блоке try...catch. Таким образом, если условия не выполняются, они терпят неудачу и останавливаются, если они выполняются, он создает объект и устанавливает переменные OUTSIDE блока try...catch, который работает. Мой новый код выглядит следующим образом:

package routines; 

import java.io.IOException; 
import java.util.Random; 

import game.*; 

public class MovePlayer extends Routine { 

    private final int destX; 
    private final int destY; 
    private final Random random = new Random(); 

    public MovePlayer(int destX, int destY, GameBoard board) throws IOException { 
     super(); 
     try { 
      if (destY > board.getHeight() || destX > board.getWidth()) { 
       throw new IllegalArgumentException(">>> Error while creating routine, one or more coords are outside of the game board"); 
      } else { 
      } 
     } catch (IllegalArgumentException e) { 
      fail(); 
     System.err.println(e.getLocalizedMessage()); 
    } 
    this.destX = destX; 
    this.destY = destY; 
} 
1

с помощью блока

try{ 

} 
catch(Exception){ 

} 
finally{ 

} 

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

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

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

Я бы определенно посмотрел на это, это очень часто используемая часть современных языков!

+0

Возможно, стоит упомянуть и выражение 'finally'. Очень распространенная ошибка заключается в том, чтобы открыть 'FileWriter' и никогда не закрывать его из-за' exception'. – Emz

+0

@ Действительно, я добавил это. – Sossenbinder

+0

Не можем ли мы закрыть какой-либо поток, писатель или читатель в ловушке? – itwasntme

Смежные вопросы