From dbb7c99ae37c9b04e885c83b853e6cfdd46e331f Mon Sep 17 00:00:00 2001 From: Safak Date: Mon, 9 Dec 2024 17:11:48 +0100 Subject: [PATCH] Optimized Exception handling for De-/Serialization in PrivateBank.java --- src/main/java/bank/PrivateBank.java | 50 +++++++++++++++---- .../java/bank/exceptions/IOException.java | 4 +- 2 files changed, 41 insertions(+), 13 deletions(-) diff --git a/src/main/java/bank/PrivateBank.java b/src/main/java/bank/PrivateBank.java index d485414..b400f37 100644 --- a/src/main/java/bank/PrivateBank.java +++ b/src/main/java/bank/PrivateBank.java @@ -367,7 +367,7 @@ public class PrivateBank implements Bank, JsonSerializer, JsonDeser * * @throws IOException if an error occurs while deserializing */ - public void readAccounts() throws IOException, java.io.IOException, AccountAlreadyExistsException, TransactionAlreadyExistException, TransactionAttributeException { + public void readAccounts() throws IOException, AccountAlreadyExistsException, TransactionAlreadyExistException, TransactionAttributeException { /* 1. JSONs einlesen 2. for each Transaction @@ -375,23 +375,30 @@ public class PrivateBank implements Bank, JsonSerializer, JsonDeser 2. Objekte in einer Liste zusammenführen 3. Konto mit einer Liste von Transaktionen erzeugen */ - List transactions = new ArrayList<>(); - File directory = new File(directoryName); File[] files = directory.listFiles(); if (files != null) { // jedes file ist ein Konto for (File file : files) { + List transactions; String accountName = file.getName().substring(0, file.getName().lastIndexOf(".")); + String jsonContent; + + try { + jsonContent = Files.readString(Paths.get(directoryName + "/" + file.getName())); + } catch (java.io.IOException e) { + System.out.println("Zum Account: " + accountName + " konnte die Datei nicht geöffnet werden"); + continue; + } - String jsonContent = Files.readString(Paths.get(directoryName + "/" + file.getName())); JsonElement accountData = JsonParser.parseString(jsonContent); - for (JsonElement account : accountData.getAsJsonArray()) { - JsonObject accountObject = account.getAsJsonObject(); - Transaction t = deserialize(accountObject, null, null); - transactions.add(t); + try{ + transactions = readAccountHelper(accountData, accountName); + } catch (IOException e){ + System.out.println(e); + continue; } createAccount(accountName, transactions); @@ -399,6 +406,21 @@ public class PrivateBank implements Bank, JsonSerializer, JsonDeser } } + private List readAccountHelper(JsonElement accountData, String accountName) throws IOException { + List transactions = new ArrayList<>(); + for (JsonElement account : accountData.getAsJsonArray()) { + JsonObject accountObject = account.getAsJsonObject(); + Transaction t; + try{ + t = deserialize(accountObject, null, null); + } catch (JsonParseException e){ + throw new IOException("Fehler beim Laden des Accounts: " + accountName); + } + transactions.add(t); + } + return transactions; + } + /** * Export Account to JSON * @@ -415,7 +437,11 @@ public class PrivateBank implements Bank, JsonSerializer, JsonDeser List transactions = this.accountsToTransactions.get(account); for (Transaction transaction : transactions) - accountData.add(serialize(transaction, null, null)); + try{ + accountData.add(serialize(transaction, null, null)); + } catch (JsonParseException e){ + throw new IOException("Fehler beim Speichern des Accounts: " + account); + } Gson gson = new GsonBuilder().setPrettyPrinting().create(); String filename = directoryName + "/" + account + ".json"; @@ -458,8 +484,9 @@ public class PrivateBank implements Bank, JsonSerializer, JsonDeser case "Payment": return new Payment(date, amount, description, transactionInstance.get("incomingInterest").getAsDouble(), transactionInstance.get("outgoingInterest").getAsDouble()); + default: + throw new JsonParseException("Unknown transaction type: " + transactionType); } - return null; } /** @@ -482,7 +509,8 @@ public class PrivateBank implements Bank, JsonSerializer, JsonDeser else if (transaction instanceof Payment) rootObject.addProperty("CLASSNAME", "Payment"); - + else + throw new JsonParseException("Unknown transaction type: " + transaction.getClass().getName()); JsonObject jsonObject = new JsonObject(); diff --git a/src/main/java/bank/exceptions/IOException.java b/src/main/java/bank/exceptions/IOException.java index f3ec705..a42806e 100644 --- a/src/main/java/bank/exceptions/IOException.java +++ b/src/main/java/bank/exceptions/IOException.java @@ -1,7 +1,7 @@ package bank.exceptions; public class IOException extends Exception { - public IOException() { - super("Fehler in der De-/ Serialisierung der Daten"); + public IOException(String message) { + super("Fehler in der De-/ Serialisierung der Daten. " + message); } }