Bonita manejo FilenotFoundException -- java campo con exception camp codereview Relacionados El problema

Pretty handling FileNotFoundException


1
vote

problema

Español

Tengo un pedazo de código que inicializa el escáner de dos maneras posibles:

  • Constructor de argumentos crea escáner que utiliza STDIO (System.in) como fuente

  • Contractor con cadena, que crea escáner, que usa el archivo como fuente, donde la cadena es una ruta para archivar

se ve así:

  package com.thecodingwombat.screens;  public class TitleScreen implements Screen { private Stage stage; private GameScreen[] gameScreens; private TitleScreen titleScreen; private Game game; private AssetManager assetManager; private Image board; private GlyphLayout layout = new GlyphLayout(); private String[] boardDescriptions; private Texture[] boardPreviews; private int currentBoardIndex = 1; private int[] boardSizes; private BitmapFont font; private Label boardDescriptionLabel;  public TitleScreen(Game game, AssetManager assetManager) {     this.game = game;     this.assetManager = assetManager;     this.titleScreen = this;     stage = new Stage(new ScreenViewport());      font = assetManager.get("smallerRegularFont.ttf", BitmapFont.class);     Texture board3 = assetManager.get("board_preview_3.png", Texture.class);     Texture board4 = assetManager.get("board_preview_4.png", Texture.class);     Texture board5 = assetManager.get("board_preview_5.png", Texture.class);     Texture board6 = assetManager.get("board_preview_6.png", Texture.class);     Texture board8 = assetManager.get("board_preview_8.png", Texture.class);      createTitle();     createButtons();      boardDescriptions = new String[] {"Small - 3x3", "Classic - 4x4", "Big - 5x5", "Bigger - 6x6", "Huge - 8x8"};     boardSizes = new int[] {3, 4, 5, 6, 8};     gameScreens = new GameScreen[5];     boardPreviews = new Texture[] {board3, board4, board5, board6, board8};      board = new Image(boardPreviews[1]);     board.setBounds(TotallyNot2048.SCREEN_WIDTH / 2 - 300 / 2, TotallyNot2048.SCREEN_HEIGHT / 3 + layout.height * 1.5f, 300, 300);     stage.addActor(board);      boardDescriptionLabel = new Label(boardDescriptions[1], new Label.LabelStyle(font, new Color(.2f, .2f, .2f, 1f)));     boardDescriptionLabel.setBounds(TotallyNot2048.SCREEN_WIDTH / 2 - 150, TotallyNot2048.SCREEN_HEIGHT / 3, 300, font.getCapHeight());     boardDescriptionLabel.setAlignment(Align.center);      stage.addActor(boardDescriptionLabel); }  private void createButtons() {     TextButton.TextButtonStyle button1Style = new TextButton.TextButtonStyle();     button1Style.font = font;     button1Style.fontColor = new Color(.2f, .2f, .2f, 1f);      layout.setText(font, "Start Game");      TextButton play = new TextButton("Start Game", button1Style);     Image leftButton = new Image(assetManager.get("leftButton.png", Texture.class));     Image rightButton = new Image(assetManager.get("rightButton.png", Texture.class));      play.setBounds(TotallyNot2048.SCREEN_WIDTH / 2 - layout.width * .75f, TotallyNot2048.SCREEN_HEIGHT / 3 - layout.height * 3, layout.width * 1.5f, layout.height * 2);     leftButton.setBounds(TotallyNot2048.SCREEN_WIDTH / 2 - 300 / 2 - layout.height * 1.5f, TotallyNot2048.SCREEN_HEIGHT / 3 - layout.height * .2f, layout.height * 1.5f, layout.height * 1.5f);     rightButton.setBounds(TotallyNot2048.SCREEN_WIDTH / 2 + 300 / 2, TotallyNot2048.SCREEN_HEIGHT / 3 - layout.height * .2f, layout.height * 1.5f, layout.height * 1.5f);      stage.addActor(play);     stage.addActor(leftButton);     stage.addActor(rightButton);      play.addListener(new InputListener() {         @Override         public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {             if (gameScreens[currentBoardIndex] == null)                 gameScreens[currentBoardIndex] = new GameScreen(game, titleScreen, assetManager, boardSizes[currentBoardIndex]);             game.setScreen(gameScreens[currentBoardIndex]);             gameScreens[currentBoardIndex].setFontSize();             return true;         }     });      leftButton.addListener(new InputListener() {         @Override         public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {             if (currentBoardIndex == 0)                 currentBoardIndex = 4;             else                 currentBoardIndex--;             boardDescriptionLabel.setText(boardDescriptions[currentBoardIndex]);             board.setDrawable(new TextureRegionDrawable(new TextureRegion(boardPreviews[currentBoardIndex])));             return true;         }     });      rightButton.addListener(new InputListener() {         @Override         public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {             if (currentBoardIndex == 4)                 currentBoardIndex = 0;             else                 currentBoardIndex++;             boardDescriptionLabel.setText(boardDescriptions[currentBoardIndex]);             board.setDrawable(new TextureRegionDrawable(new TextureRegion(boardPreviews[currentBoardIndex])));             return true;         }     }); }  private void createTitle() {     Label.LabelStyle label1Style = new Label.LabelStyle();     label1Style.font = assetManager.get("bigFont.ttf", BitmapFont.class);     label1Style.fontColor = new Color(.2f, .2f, .2f, 1f);     Label title = new Label("2048", label1Style);     title.setAlignment(Align.center);     title.setBounds(0, Gdx.graphics.getHeight() * .85f, Gdx.graphics.getWidth(), 0);     stage.addActor(title); }  @Override public void show() {     Gdx.input.setInputProcessor(stage); }  @Override public void render(float delta) {     Gdx.gl.glClearColor(1, 1, 1, 1);     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);     stage.act();     stage.draw(); } } 0  

en la principal:

  package com.thecodingwombat.screens;  public class TitleScreen implements Screen { private Stage stage; private GameScreen[] gameScreens; private TitleScreen titleScreen; private Game game; private AssetManager assetManager; private Image board; private GlyphLayout layout = new GlyphLayout(); private String[] boardDescriptions; private Texture[] boardPreviews; private int currentBoardIndex = 1; private int[] boardSizes; private BitmapFont font; private Label boardDescriptionLabel;  public TitleScreen(Game game, AssetManager assetManager) {     this.game = game;     this.assetManager = assetManager;     this.titleScreen = this;     stage = new Stage(new ScreenViewport());      font = assetManager.get("smallerRegularFont.ttf", BitmapFont.class);     Texture board3 = assetManager.get("board_preview_3.png", Texture.class);     Texture board4 = assetManager.get("board_preview_4.png", Texture.class);     Texture board5 = assetManager.get("board_preview_5.png", Texture.class);     Texture board6 = assetManager.get("board_preview_6.png", Texture.class);     Texture board8 = assetManager.get("board_preview_8.png", Texture.class);      createTitle();     createButtons();      boardDescriptions = new String[] {"Small - 3x3", "Classic - 4x4", "Big - 5x5", "Bigger - 6x6", "Huge - 8x8"};     boardSizes = new int[] {3, 4, 5, 6, 8};     gameScreens = new GameScreen[5];     boardPreviews = new Texture[] {board3, board4, board5, board6, board8};      board = new Image(boardPreviews[1]);     board.setBounds(TotallyNot2048.SCREEN_WIDTH / 2 - 300 / 2, TotallyNot2048.SCREEN_HEIGHT / 3 + layout.height * 1.5f, 300, 300);     stage.addActor(board);      boardDescriptionLabel = new Label(boardDescriptions[1], new Label.LabelStyle(font, new Color(.2f, .2f, .2f, 1f)));     boardDescriptionLabel.setBounds(TotallyNot2048.SCREEN_WIDTH / 2 - 150, TotallyNot2048.SCREEN_HEIGHT / 3, 300, font.getCapHeight());     boardDescriptionLabel.setAlignment(Align.center);      stage.addActor(boardDescriptionLabel); }  private void createButtons() {     TextButton.TextButtonStyle button1Style = new TextButton.TextButtonStyle();     button1Style.font = font;     button1Style.fontColor = new Color(.2f, .2f, .2f, 1f);      layout.setText(font, "Start Game");      TextButton play = new TextButton("Start Game", button1Style);     Image leftButton = new Image(assetManager.get("leftButton.png", Texture.class));     Image rightButton = new Image(assetManager.get("rightButton.png", Texture.class));      play.setBounds(TotallyNot2048.SCREEN_WIDTH / 2 - layout.width * .75f, TotallyNot2048.SCREEN_HEIGHT / 3 - layout.height * 3, layout.width * 1.5f, layout.height * 2);     leftButton.setBounds(TotallyNot2048.SCREEN_WIDTH / 2 - 300 / 2 - layout.height * 1.5f, TotallyNot2048.SCREEN_HEIGHT / 3 - layout.height * .2f, layout.height * 1.5f, layout.height * 1.5f);     rightButton.setBounds(TotallyNot2048.SCREEN_WIDTH / 2 + 300 / 2, TotallyNot2048.SCREEN_HEIGHT / 3 - layout.height * .2f, layout.height * 1.5f, layout.height * 1.5f);      stage.addActor(play);     stage.addActor(leftButton);     stage.addActor(rightButton);      play.addListener(new InputListener() {         @Override         public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {             if (gameScreens[currentBoardIndex] == null)                 gameScreens[currentBoardIndex] = new GameScreen(game, titleScreen, assetManager, boardSizes[currentBoardIndex]);             game.setScreen(gameScreens[currentBoardIndex]);             gameScreens[currentBoardIndex].setFontSize();             return true;         }     });      leftButton.addListener(new InputListener() {         @Override         public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {             if (currentBoardIndex == 0)                 currentBoardIndex = 4;             else                 currentBoardIndex--;             boardDescriptionLabel.setText(boardDescriptions[currentBoardIndex]);             board.setDrawable(new TextureRegionDrawable(new TextureRegion(boardPreviews[currentBoardIndex])));             return true;         }     });      rightButton.addListener(new InputListener() {         @Override         public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {             if (currentBoardIndex == 4)                 currentBoardIndex = 0;             else                 currentBoardIndex++;             boardDescriptionLabel.setText(boardDescriptions[currentBoardIndex]);             board.setDrawable(new TextureRegionDrawable(new TextureRegion(boardPreviews[currentBoardIndex])));             return true;         }     }); }  private void createTitle() {     Label.LabelStyle label1Style = new Label.LabelStyle();     label1Style.font = assetManager.get("bigFont.ttf", BitmapFont.class);     label1Style.fontColor = new Color(.2f, .2f, .2f, 1f);     Label title = new Label("2048", label1Style);     title.setAlignment(Align.center);     title.setBounds(0, Gdx.graphics.getHeight() * .85f, Gdx.graphics.getWidth(), 0);     stage.addActor(title); }  @Override public void show() {     Gdx.input.setInputProcessor(stage); }  @Override public void render(float delta) {     Gdx.gl.glClearColor(1, 1, 1, 1);     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);     stage.act();     stage.draw(); } } 1  

Funciona muy bien, pero no se ve bonita cuando se trata de un manejo de excepciones. Mi sueño estaría creando un método, en el que manejaré posibles problemas relacionados con los archivos y el siguiente, que hará el trabajo, al igual que el buen viejo tío Bob dijo.

¿Alguien puede echar un vistazo a esto y tal vez sugerir algunos cambios menores, para que limpie y amable?

Original en ingles

I have got a piece of code that initialize Scanner in two possible ways:

  • no argument constructor creates Scanner that uses stdIO (System.in) as source

  • contructor with String, which creates Scanner, that uses file as source, where String is a path to file

It looks like this:

public class InputMethod implements IInputMethod {  private final Scanner fileReader; private final Scanner userInput = new Scanner(System.in);  public InputMethod(String[] args) throws FileNotFoundException {     if (args.length == 1)         fileReader = setFileAsSource(args[0]);     else         fileReader = setStdIOAsSource(); }  private Scanner setFileAsSource(String filename) throws FileNotFoundException {         return new Scanner(new File(filename)); }  private Scanner setStdIOAsSource() {     return new Scanner(System.in); } } 

In main:

public static void main(String[] args) throws FileNotFoundException {     IInputMethod input= new InputMethod(args);      while (!input.getUserInput().equals("Exit")) {         // awesome stuff     }     input.closeInput(); } 

It works great, but it does not look pretty when it comes to exception handling. My dream would be creating a method, in which I will handle possible File-related problems and next one, that will do the job, just like good old Uncle Bob said.

Can anyone take a look at this and maybe suggest some minor changes, to make it clean and friendly?

     
   
   

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

Su diseño está ligeramente apagado, WHERE Orders.SalesRepID = 35 funciona Excelente para los programas de terminales, pero para pasar los argumentos en torno a que realmente no es eficiente. No hay tiempo de compilación que comprueba si estás pasando cosas que tienen sentido.

Buscar patrón de estrategia; Desea varias clases independientes que implemente la interfaz.

Para manejar la excepción, dividir su código en dos mitades:

La primera mitad prepara,

la segunda mitad ejecuta.

Además, debe dividir la responsabilidad de la fuente de entrada y la entrada del usuario. En este momento, tendría que volver a implementar WHERE Orders.SalesRepID = 36 para cada WHERE Orders.SalesRepID = 37 , que es no deseado.

Al dividir su código a cada caso, tendrá 1 caso específico en el que aún está en su código de llamada (no ha creado un 998877766555443318 , pero usted sabe que Vas a leer de un archivo. Puede manejar su excepción allí.

Su código se estructuraría así:

  WHERE Orders.SalesRepID = 39  

En el WHERE ... IN0 podría manejar la excepción. Luego, en general, podría decir "Bueno, si la entrada sigue siendo nula, no nos instanciamos correctamente y deberíamos apagar".

 

Your design is slightly off, String args[] works great for terminal programs, but for passing arguments around it's really not efficient. There's no compile time checking to see if you're passing around things that make sense.

Look up Strategy Pattern; You want several independent classes each implementing the interface.

To handle the exception, split your code into two halves:

The first half prepares,

The second half executes.

Additionally, you should split up the responsibility of input source and user input. Right now you'd have to re-implement userInput for each InputMethod, which is unwanted.

By splitting up your code to each case, you'll have 1 specific case where you're still in your calling code (you haven't instantiated an InputMethod yet), but you know that you're going to read from a file. You can handle your exception there.

Your code would be structured like so:

public static void main(String[] args) throws FileNotFoundException {     IInputMethod input = null;     if(args.length == 1){         input = makeFileInputMethod(args);     } else {         input = makeStandardInputMethod();     }      //make user input object      while (!input.getUserInput().equals("Exit")) {         // awesome stuff     }     input.closeInput(); } 

In the makeFileInputMethod you could handle the exception. Then, in main, you could say "well, if input is still null, we didn't instantiate properly and we ought to shut down".

 
 

Relacionados problema

1  Mensaje de excepción de java  ( Java exception message ) 
Tengo algunas clases de excepción personalizadas que creé simplemente por tener mi propio mensaje de excepción: public class DivideByZeroException extends ...

6  Uso de la excepción al registro de la pila de ejecución  ( Use of exception to log execution stack trace ) 
He estado de ida y vuelta con un colega sobre el uso de Throwable.fillInStackTrace . Este Log clase está destinado a envolver el Fachada de registro simpl...

1  Cómo manejar el valor devuelto si se produce una excepción en un código de la biblioteca  ( How to handle returned value if an exception happens in a library code ) 
Hay un código LIB, tratando de analizar un objeto de árbol de elementos. Si ocurre una excepción, devuelve un dict vacío de DICT o un objeto parcialmente cons...

6  Clase de excepción de C ++ autocontrolada  ( Self implemented c exception class ) 
Escribí mi propia clase de excepciones, derivando de std::runtime_error para tener identificaciones de errores, marcas de tiempo y excepciones internas. Par...

6  Manejo de excepciones COM / Códigos ocupados  ( Handling com exceptions busy codes ) 
Este código escribe para sobresalir utilizando la interfaz COM. El tema general es que cualquier manejo de excepciones tiene que manejar la excepción de "Exce...

14  ¿Cuál es tu opinión sobre un método de tiro ()?  ( What s your opinion on a throw method ) 
Bloqueado . Esta pregunta y sus respuestas son bloqueadas porque la pregunta es off-topic pero tiene importancia histórica. Actualmente no está a...

7  ¿Es esta la forma incorrecta de manejar agregateException con tareas?  ( Is this the wrong way to handle aggregateexception with tasks ) 
Estoy viendo un gran código como este en mi nuevo sitio try { Task.Factory.StartNew(() => { ... ...

9  Proporcionando interfaces de "envoltura" sin marcar para una API con excepciones verificadas  ( Providing unchecked exception wrapper interfaces for an api with checked excep ) 
Bloqueado . Esta pregunta y sus respuestas son bloqueadas porque la pregunta es off-topic pero tiene importancia histórica. Actualmente no está a...

15  Usando finalmente con declaración de retorno o no  ( Using finally with return statement or not ) 
Me preguntaba si es la forma correcta de colocar siempre la declaración de devolución de una función con una cláusula 9988776665544330 en la cláusula 99887...

5  Lanzar una excepción que contiene un conjunto anidado de excepciones anteriores  ( Throw an exception which contains a nested set of previous exceptions ) 
Tengo un conjunto de objetos de dominio que intentan encontrar una solución a un problema. El objeto de nivel superior tiene un algoritmo que divide el prob...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos