From 94ae7ae0e992b7e27a3c07010e7d0eafed4ca11b Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Tue, 13 Jan 2026 07:21:42 +0200 Subject: [PATCH 1/2] Deduplicate error handling in Log and JSONParser --- .github/scripts/generate-quality-report.py | 1 + .../codename1/impl/FullScreenAdService.java | 2 +- .../src/com/codename1/io/JSONParser.java | 20 +++--- CodenameOne/src/com/codename1/io/Log.java | 14 ++-- CodenameOne/src/com/codename1/io/Socket.java | 8 ++- .../com/codename1/io/rest/RequestBuilder.java | 66 +++++++++++++------ .../com/codename1/properties/InstantUI.java | 8 ++- CodenameOne/src/com/codename1/ui/Display.java | 2 +- .../com/codename1/ui/html/HTMLComponent.java | 4 +- .../ui/layouts/mig/ConstraintParser.java | 3 +- 10 files changed, 87 insertions(+), 41 deletions(-) diff --git a/.github/scripts/generate-quality-report.py b/.github/scripts/generate-quality-report.py index e9a8ee5130..e214db99a7 100755 --- a/.github/scripts/generate-quality-report.py +++ b/.github/scripts/generate-quality-report.py @@ -817,6 +817,7 @@ def main() -> None: "NP_LOAD_OF_KNOWN_NULL_VALUE", "NP_BOOLEAN_RETURN_NULL", "REFLC_REFLECTION_MAY_INCREASE_ACCESSIBILITY_OF_CLASS", + "REC_CATCH_EXCEPTION", "UI_INHERITANCE_UNSAFE_GETRESOURCE", "URF_UNREAD_FIELD", "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD", diff --git a/CodenameOne/src/com/codename1/impl/FullScreenAdService.java b/CodenameOne/src/com/codename1/impl/FullScreenAdService.java index 1d826c8bcc..987a68ddbe 100644 --- a/CodenameOne/src/com/codename1/impl/FullScreenAdService.java +++ b/CodenameOne/src/com/codename1/impl/FullScreenAdService.java @@ -326,7 +326,7 @@ public void run() { LOCK.wait(100); } } - } catch (Exception err) { + } catch (InterruptedException err) { err.printStackTrace(); } } diff --git a/CodenameOne/src/com/codename1/io/JSONParser.java b/CodenameOne/src/com/codename1/io/JSONParser.java index a6da041d6d..34af9eafcc 100644 --- a/CodenameOne/src/com/codename1/io/JSONParser.java +++ b/CodenameOne/src/com/codename1/io/JSONParser.java @@ -431,19 +431,19 @@ public static void parse(Reader i, JSONParseCallback callback) throws IOExceptio } } } - } catch (Exception err) { - Log.e(err); - Log.p("Exception during JSON parsing at row: " + row + " column: " + column + " buffer: " + currentToken); - /*System.out.println(); - int current = i.read(); - while(current >= 0) { - System.out.print((char)current); - current = i.read(); - }*/ - i.close(); + } catch (IOException err) { + handleParsingException(i, err, row, column, currentToken); + } catch (RuntimeException err) { + handleParsingException(i, err, row, column, currentToken); } } + private static void handleParsingException(Reader i, Exception err, int row, int column, StringBuilder currentToken) throws IOException { + Log.e(err); + Log.p("Exception during JSON parsing at row: " + row + " column: " + column + " buffer: " + currentToken); + i.close(); + } + /** * Static method to convert the given {@link java.util.Map} to a valid JSON * representation. The values allowed types are: {@link java.lang.Number}, {@link java.lang.String}, {@link java.lang.Boolean}, diff --git a/CodenameOne/src/com/codename1/io/Log.java b/CodenameOne/src/com/codename1/io/Log.java index bbcf11e0df..684bffb5e6 100644 --- a/CodenameOne/src/com/codename1/io/Log.java +++ b/CodenameOne/src/com/codename1/io/Log.java @@ -518,13 +518,19 @@ protected Writer createWriter() throws IOException { } else { return Util.getWriter(FileSystemStorage.getInstance().openOutputStream(getFileURL())); } - } catch (Exception err) { - setFileWriteEnabled(false); - // currently return a "dummy" writer so we won't fail on device - return Util.getWriter(new ByteArrayOutputStream()); + } catch (IOException err) { + return fallbackWriterAfterError(); + } catch (RuntimeException err) { + return fallbackWriterAfterError(); } } + private Writer fallbackWriterAfterError() { + setFileWriteEnabled(false); + // currently return a "dummy" writer so we won't fail on device + return Util.getWriter(new ByteArrayOutputStream()); + } + private Writer getWriter() throws IOException { if (output == null) { output = createWriter(); diff --git a/CodenameOne/src/com/codename1/io/Socket.java b/CodenameOne/src/com/codename1/io/Socket.java index dd00e803d7..f4e0fbf733 100644 --- a/CodenameOne/src/com/codename1/io/Socket.java +++ b/CodenameOne/src/com/codename1/io/Socket.java @@ -173,7 +173,13 @@ public void run() { sc.connectionError(Util.getImplementation().getSocketErrorCode(connection), Util.getImplementation().getSocketErrorMessage(connection)); } } - } catch (Exception err) { + } catch (InstantiationException err) { + // instansiating the class has caused a problem + Log.e(err); + } catch (IllegalAccessException err) { + // instansiating the class has caused a problem + Log.e(err); + } catch (RuntimeException err) { // instansiating the class has caused a problem Log.e(err); } diff --git a/CodenameOne/src/com/codename1/io/rest/RequestBuilder.java b/CodenameOne/src/com/codename1/io/rest/RequestBuilder.java index edff6bd1ff..f4d5b24e3e 100644 --- a/CodenameOne/src/com/codename1/io/rest/RequestBuilder.java +++ b/CodenameOne/src/com/codename1/io/rest/RequestBuilder.java @@ -658,10 +658,15 @@ public Response getAsProperties(Class type) { CN.addToQueueAndWait(request); Map response = ((Connection) request).json; try { - PropertyBusinessObject pb = (PropertyBusinessObject) type.newInstance(); - pb.getPropertyIndex().populateFromMap(response); + PropertyBusinessObject pb = createBusinessObject(type, response); return new Response(request.getResponseCode(), pb, request.getResponseErrorMessage()); - } catch (Exception err) { + } catch (InstantiationException err) { + Log.e(err); + throw new RuntimeException(err.toString()); + } catch (IllegalAccessException err) { + Log.e(err); + throw new RuntimeException(err.toString()); + } catch (RuntimeException err) { Log.e(err); throw new RuntimeException(err.toString()); } @@ -718,14 +723,15 @@ public Response> getAsPropertyList(Class type, Stri if (lst == null) { return null; } - List result = new ArrayList(); - for (Map m : lst) { - PropertyBusinessObject pb = (PropertyBusinessObject) type.newInstance(); - pb.getPropertyIndex().populateFromMap(m); - result.add(pb); - } + List result = buildBusinessObjectList(type, lst); return new Response(request.getResponseCode(), result, request.getResponseErrorMessage()); - } catch (Exception err) { + } catch (InstantiationException err) { + Log.e(err); + throw new RuntimeException(err.toString()); + } catch (IllegalAccessException err) { + Log.e(err); + throw new RuntimeException(err.toString()); + } catch (RuntimeException err) { Log.e(err); throw new RuntimeException(err.toString()); } @@ -815,6 +821,20 @@ private Connection createRequest(boolean parseJson) { return req; } + private PropertyBusinessObject createBusinessObject(Class type, Map response) throws InstantiationException, IllegalAccessException { + PropertyBusinessObject pb = (PropertyBusinessObject) type.newInstance(); + pb.getPropertyIndex().populateFromMap(response); + return pb; + } + + private List buildBusinessObjectList(Class type, List lst) throws InstantiationException, IllegalAccessException { + List result = new ArrayList(); + for (Map m : lst) { + result.add(createBusinessObject(type, m)); + } + return result; + } + private static class FetchAsPropertyListActionListener implements ActionListener { private final Connection request; private final String root; @@ -843,15 +863,16 @@ public void actionPerformed(NetworkEvent evt) { return; } try { - List result = new ArrayList(); - for (Map m : lst) { - PropertyBusinessObject pb = (PropertyBusinessObject) type.newInstance(); - pb.getPropertyIndex().populateFromMap(m); - result.add(pb); - } + List result = buildBusinessObjectList(type, lst); res = new Response(evt.getResponseCode(), result, evt.getMessage()); callback.completed(res); - } catch (Exception err) { + } catch (InstantiationException err) { + Log.e(err); + throw new RuntimeException(err.toString()); + } catch (IllegalAccessException err) { + Log.e(err); + throw new RuntimeException(err.toString()); + } catch (RuntimeException err) { Log.e(err); throw new RuntimeException(err.toString()); } @@ -932,11 +953,16 @@ public void actionPerformed(NetworkEvent evt) { Response res = null; Map response = (Map) evt.getMetaData(); try { - PropertyBusinessObject pb = (PropertyBusinessObject) type.newInstance(); - pb.getPropertyIndex().populateFromMap(response); + PropertyBusinessObject pb = createBusinessObject(type, response); res = new Response(evt.getResponseCode(), pb, evt.getMessage()); callback.completed(res); - } catch (Exception err) { + } catch (InstantiationException err) { + Log.e(err); + throw new RuntimeException(err.toString()); + } catch (IllegalAccessException err) { + Log.e(err); + throw new RuntimeException(err.toString()); + } catch (RuntimeException err) { Log.e(err); throw new RuntimeException(err.toString()); } diff --git a/CodenameOne/src/com/codename1/properties/InstantUI.java b/CodenameOne/src/com/codename1/properties/InstantUI.java index 56d3455cc1..6802aca598 100644 --- a/CodenameOne/src/com/codename1/properties/InstantUI.java +++ b/CodenameOne/src/com/codename1/properties/InstantUI.java @@ -238,7 +238,13 @@ private void createEntryForProperty(PropertyBase b, Container cnt, cnt.add(b.getLabel()). add(cmp); allBindings.add(uib.bind(b, cmp)); - } catch (Exception err) { + } catch (InstantiationException err) { + Log.e(err); + throw new RuntimeException("Custom property instant UI failed for " + b.getName() + " " + err); + } catch (IllegalAccessException err) { + Log.e(err); + throw new RuntimeException("Custom property instant UI failed for " + b.getName() + " " + err); + } catch (RuntimeException err) { Log.e(err); throw new RuntimeException("Custom property instant UI failed for " + b.getName() + " " + err); } diff --git a/CodenameOne/src/com/codename1/ui/Display.java b/CodenameOne/src/com/codename1/ui/Display.java index 91c709198d..45d8ebd0b5 100644 --- a/CodenameOne/src/com/codename1/ui/Display.java +++ b/CodenameOne/src/com/codename1/ui/Display.java @@ -1201,7 +1201,7 @@ void edtLoopImpl() { paintTransitionAnimation(); return; } - } catch (Exception ignor) { + } catch (RuntimeException ignor) { Log.e(ignor); } long currentTime = System.currentTimeMillis(); diff --git a/CodenameOne/src/com/codename1/ui/html/HTMLComponent.java b/CodenameOne/src/com/codename1/ui/html/HTMLComponent.java index 0cd2b460a3..1fe1a7aedd 100644 --- a/CodenameOne/src/com/codename1/ui/html/HTMLComponent.java +++ b/CodenameOne/src/com/codename1/ui/html/HTMLComponent.java @@ -2445,7 +2445,9 @@ private void handleImageMapArea(HTMLElement areaTag) { // Note: The 'circle' SHAPE in AREA tag is implemented as a rectangle to avoid complication of circle pixel collision error = false; } - } catch (Exception e) { // Can be number format exception or index out of bounds + } catch (NumberFormatException e) { // Can be number format exception or index out of bounds + // do nothing - error will stay true + } catch (IndexOutOfBoundsException e) { // do nothing - error will stay true } if (error) { diff --git a/CodenameOne/src/com/codename1/ui/layouts/mig/ConstraintParser.java b/CodenameOne/src/com/codename1/ui/layouts/mig/ConstraintParser.java index 660a21c5b7..c6128d94f1 100644 --- a/CodenameOne/src/com/codename1/ui/layouts/mig/ConstraintParser.java +++ b/CodenameOne/src/com/codename1/ui/layouts/mig/ConstraintParser.java @@ -933,13 +933,12 @@ public static CC parseComponentConstraint(String s) { throw new IllegalArgumentException("Unknown keyword."); - } catch (Exception ex) { + } catch (RuntimeException ex) { Log.e(ex); throw new IllegalArgumentException("Error parsing Constraint: '" + part + "'"); } } -// cc = (CC) serializeTest(cc); return cc; } From 07bf1cf9218b6a294f756d6476b0d6bdf6c8876e Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Tue, 13 Jan 2026 16:22:25 +0200 Subject: [PATCH 2/2] Fix static helper access in RequestBuilder --- CodenameOne/src/com/codename1/io/rest/RequestBuilder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CodenameOne/src/com/codename1/io/rest/RequestBuilder.java b/CodenameOne/src/com/codename1/io/rest/RequestBuilder.java index f4d5b24e3e..a143338ed6 100644 --- a/CodenameOne/src/com/codename1/io/rest/RequestBuilder.java +++ b/CodenameOne/src/com/codename1/io/rest/RequestBuilder.java @@ -821,13 +821,13 @@ private Connection createRequest(boolean parseJson) { return req; } - private PropertyBusinessObject createBusinessObject(Class type, Map response) throws InstantiationException, IllegalAccessException { + private static PropertyBusinessObject createBusinessObject(Class type, Map response) throws InstantiationException, IllegalAccessException { PropertyBusinessObject pb = (PropertyBusinessObject) type.newInstance(); pb.getPropertyIndex().populateFromMap(response); return pb; } - private List buildBusinessObjectList(Class type, List lst) throws InstantiationException, IllegalAccessException { + private static List buildBusinessObjectList(Class type, List lst) throws InstantiationException, IllegalAccessException { List result = new ArrayList(); for (Map m : lst) { result.add(createBusinessObject(type, m));