From e9a29fb098374fd0186f9a17cdf6015012283cde Mon Sep 17 00:00:00 2001 From: srowen Date: Mon, 17 Nov 2008 17:56:31 +0000 Subject: [PATCH] move to singleton ReaderException for a bit more performance git-svn-id: https://zxing.googlecode.com/svn/trunk@714 59b500cc-1b3d-0410-9834-0bbf25fbcc57 --- .../bug/AWTImageMonochromeBitmapSource.java | 2 +- .../src/com/google/zxing/ReaderException.java | 28 +++++++++++-------- .../zxing/common/BlackPointEstimator.java | 2 +- .../zxing/common/DefaultGridSampler.java | 2 +- .../com/google/zxing/common/GridSampler.java | 4 +-- .../zxing/datamatrix/DataMatrixReader.java | 11 ++++---- .../datamatrix/decoder/BitMatrixParser.java | 4 +-- .../decoder/DecodedBitStreamParser.java | 28 +++++++++---------- .../zxing/datamatrix/decoder/Decoder.java | 2 +- .../zxing/datamatrix/decoder/Version.java | 4 +-- .../zxing/datamatrix/detector/Detector.java | 6 ++-- .../google/zxing/oned/AbstractOneDReader.java | 6 ++-- .../zxing/oned/AbstractUPCEANReader.java | 12 ++++---- .../com/google/zxing/oned/Code128Reader.java | 14 +++++----- .../com/google/zxing/oned/Code39Reader.java | 22 +++++++-------- .../com/google/zxing/oned/EAN13Reader.java | 2 +- .../zxing/oned/MultiFormatOneDReader.java | 2 +- .../zxing/oned/MultiFormatUPCEANReader.java | 2 +- .../src/com/google/zxing/oned/UPCAReader.java | 2 +- .../src/com/google/zxing/oned/UPCEReader.java | 2 +- .../com/google/zxing/qrcode/QRCodeReader.java | 11 ++++---- .../zxing/qrcode/decoder/BitMatrixParser.java | 8 +++--- .../decoder/DecodedBitStreamParser.java | 14 +++++----- .../google/zxing/qrcode/decoder/Decoder.java | 2 +- .../qrcode/decoder/ErrorCorrectionLevel.java | 2 +- .../com/google/zxing/qrcode/decoder/Mode.java | 2 +- .../google/zxing/qrcode/decoder/Version.java | 4 +-- .../detector/AlignmentPatternFinder.java | 2 +- .../zxing/qrcode/detector/Detector.java | 8 +++--- .../qrcode/detector/FinderPatternFinder.java | 2 +- 30 files changed, 108 insertions(+), 104 deletions(-) diff --git a/bug/src/com/google/zxing/client/bug/AWTImageMonochromeBitmapSource.java b/bug/src/com/google/zxing/client/bug/AWTImageMonochromeBitmapSource.java index 3422f8613..9bd0cc0c8 100644 --- a/bug/src/com/google/zxing/client/bug/AWTImageMonochromeBitmapSource.java +++ b/bug/src/com/google/zxing/client/bug/AWTImageMonochromeBitmapSource.java @@ -47,7 +47,7 @@ public final class AWTImageMonochromeBitmapSource extends BaseMonochromeBitmapSo try { grabber.grabPixels(); } catch (InterruptedException ie) { - throw new ReaderException("Interrupted while reading pixels"); + throw ReaderException.getInstance(); } } diff --git a/core/src/com/google/zxing/ReaderException.java b/core/src/com/google/zxing/ReaderException.java index 58f8978c3..750dde8c8 100644 --- a/core/src/com/google/zxing/ReaderException.java +++ b/core/src/com/google/zxing/ReaderException.java @@ -23,19 +23,25 @@ package com.google.zxing; * * @author Sean Owen */ +public final class ReaderException extends Exception { -// TODO: Currently we throw up to 400 ReaderExceptions while scanning a single 240x240 image before -// rejecting it. This involves a lot of overhead and memory allocation, and affects both performance -// and latency on continuous scan clients. In the future, we should change all the decoders not to -// throw exceptions for routine events, like not finding a barcode on a given row. Instead, we -// should return error codes back to the callers, and simply delete this class. In the mean time, I -// have altered this class to be as lightweight as possible, by ignoring the exception string, and -// by disabling the generation of stack traces, which is especially time consuming. These are just -// temporary measures, pending the big cleanup. -public final class ReaderException extends java.lang.Throwable { + // TODO: Currently we throw up to 400 ReaderExceptions while scanning a single 240x240 image before + // rejecting it. This involves a lot of overhead and memory allocation, and affects both performance + // and latency on continuous scan clients. In the future, we should change all the decoders not to + // throw exceptions for routine events, like not finding a barcode on a given row. Instead, we + // should return error codes back to the callers, and simply delete this class. In the mean time, I + // have altered this class to be as lightweight as possible, by ignoring the exception string, and + // by disabling the generation of stack traces, which is especially time consuming. These are just + // temporary measures, pending the big cleanup. - public ReaderException(String message) { - // Do not pass message to Throwable, let it get optimized out + private static final ReaderException instance = new ReaderException(); + + private ReaderException() { + // do nothing + } + + public static ReaderException getInstance() { + return instance; } // Prevent stack traces from being taken diff --git a/core/src/com/google/zxing/common/BlackPointEstimator.java b/core/src/com/google/zxing/common/BlackPointEstimator.java index 7e0897603..2b683c239 100644 --- a/core/src/com/google/zxing/common/BlackPointEstimator.java +++ b/core/src/com/google/zxing/common/BlackPointEstimator.java @@ -88,7 +88,7 @@ public final class BlackPointEstimator { // for 1D formats, which are relatively lenient. // We arbitrarily say "close" is "<= 1/16 of the total histogram buckets apart" if (secondPeak - firstPeak <= numBuckets >> 4) { - throw new ReaderException("Too little dynamic range in luminance"); + throw ReaderException.getInstance(); } // Find a valley between them that is low and closer to the white peak diff --git a/core/src/com/google/zxing/common/DefaultGridSampler.java b/core/src/com/google/zxing/common/DefaultGridSampler.java index b0d4ece08..9932f6325 100644 --- a/core/src/com/google/zxing/common/DefaultGridSampler.java +++ b/core/src/com/google/zxing/common/DefaultGridSampler.java @@ -67,7 +67,7 @@ public final class DefaultGridSampler extends GridSampler { // This results in an ugly runtime exception despite our clever checks above -- can't have that. // We could check each point's coordinates but that feels duplicative. We settle for // catching and wrapping ArrayIndexOutOfBoundsException. - throw new ReaderException(aioobe.toString()); + throw ReaderException.getInstance(); } } return bits; diff --git a/core/src/com/google/zxing/common/GridSampler.java b/core/src/com/google/zxing/common/GridSampler.java index c90b6e0b0..2d0b81d4d 100644 --- a/core/src/com/google/zxing/common/GridSampler.java +++ b/core/src/com/google/zxing/common/GridSampler.java @@ -122,7 +122,7 @@ public abstract class GridSampler { int x = (int) points[offset]; int y = (int) points[offset + 1]; if (x < -1 || x > width || y < -1 || y > height) { - throw new ReaderException("Transformed point out of bounds at " + x + ',' + y); + throw ReaderException.getInstance(); } nudged = false; if (x == -1) { @@ -146,7 +146,7 @@ public abstract class GridSampler { int x = (int) points[offset]; int y = (int) points[offset + 1]; if (x < -1 || x > width || y < -1 || y > height) { - throw new ReaderException("Transformed point out of bounds at " + x + ',' + y); + throw ReaderException.getInstance(); } nudged = false; if (x == -1) { diff --git a/core/src/com/google/zxing/datamatrix/DataMatrixReader.java b/core/src/com/google/zxing/datamatrix/DataMatrixReader.java index 1e602cd31..284efaaf9 100644 --- a/core/src/com/google/zxing/datamatrix/DataMatrixReader.java +++ b/core/src/com/google/zxing/datamatrix/DataMatrixReader.java @@ -92,7 +92,7 @@ public final class DataMatrixReader implements Reader { borderWidth++; } if (borderWidth == minDimension) { - throw new ReaderException("No black pixels found along diagonal"); + throw ReaderException.getInstance(); } // And then keep tracking across the top-left black module to determine module size @@ -101,7 +101,7 @@ public final class DataMatrixReader implements Reader { moduleEnd++; } if (moduleEnd == width) { - throw new ReaderException("No end to black pixels found along row"); + throw ReaderException.getInstance(); } int moduleSize = moduleEnd - borderWidth; @@ -112,14 +112,13 @@ public final class DataMatrixReader implements Reader { columnEndOfSymbol--; } if (columnEndOfSymbol < 0) { - throw new ReaderException("Can't find end of bottommost black module"); + throw ReaderException.getInstance(); } columnEndOfSymbol++; // Make sure width of barcode is a multiple of module size if ((columnEndOfSymbol - borderWidth) % moduleSize != 0) { - throw new ReaderException("Bad module size / width: " + moduleSize + - " / " + (columnEndOfSymbol - borderWidth)); + throw ReaderException.getInstance(); } int dimension = (columnEndOfSymbol - borderWidth) / moduleSize; @@ -130,7 +129,7 @@ public final class DataMatrixReader implements Reader { int sampleDimension = borderWidth + (dimension - 1) * moduleSize; if (sampleDimension >= width || sampleDimension >= height) { - throw new ReaderException("Estimated pure image size is beyond image boundaries"); + throw ReaderException.getInstance(); } // Now just read off the bits diff --git a/core/src/com/google/zxing/datamatrix/decoder/BitMatrixParser.java b/core/src/com/google/zxing/datamatrix/decoder/BitMatrixParser.java index 1b4b30497..443b099e3 100644 --- a/core/src/com/google/zxing/datamatrix/decoder/BitMatrixParser.java +++ b/core/src/com/google/zxing/datamatrix/decoder/BitMatrixParser.java @@ -35,7 +35,7 @@ final class BitMatrixParser { BitMatrixParser(BitMatrix bitMatrix) throws ReaderException { int dimension = bitMatrix.getDimension(); if (dimension < 10 || dimension > 144 || (dimension & 0x01) != 0) { - throw new ReaderException("Invalid dimension (" + dimension + ") Must be 0 mod 2 and >= 10 and <= 144"); + throw ReaderException.getInstance(); } version = readVersion(bitMatrix); @@ -141,7 +141,7 @@ final class BitMatrixParser { } while ((row < numRows) || (column < numColumns)); if (resultOffset != version.getTotalCodewords()) { - throw new ReaderException("Did not read all codewords"); + throw ReaderException.getInstance(); } return result; } diff --git a/core/src/com/google/zxing/datamatrix/decoder/DecodedBitStreamParser.java b/core/src/com/google/zxing/datamatrix/decoder/DecodedBitStreamParser.java index d5b0394bf..5a3293ed8 100644 --- a/core/src/com/google/zxing/datamatrix/decoder/DecodedBitStreamParser.java +++ b/core/src/com/google/zxing/datamatrix/decoder/DecodedBitStreamParser.java @@ -102,7 +102,7 @@ final class DecodedBitStreamParser { decodeBase256Segment(bits, result, byteSegments); break; default: - throw new ReaderException("Unsupported mode indicator"); + throw ReaderException.getInstance(); } mode = ASCII_ENCODE; } @@ -122,7 +122,7 @@ final class DecodedBitStreamParser { do { int oneByte = bits.readBits(8); if (oneByte == 0) { - throw new ReaderException("0 is an invalid ASCII codeword"); + throw ReaderException.getInstance(); } else if (oneByte <= 128) { // ASCII data (ASCII value + 1) oneByte = upperShift ? (oneByte + 128) : oneByte; upperShift = false; @@ -141,11 +141,11 @@ final class DecodedBitStreamParser { } else if (oneByte == 231) { // Latch to Base 256 encodation return BASE256_ENCODE; } else if (oneByte == 232) { // FNC1 - throw new ReaderException("Currently not supporting FNC1"); + throw ReaderException.getInstance(); } else if (oneByte == 233) { // Structured Append - throw new ReaderException("Currently not supporting Structured Append"); + throw ReaderException.getInstance(); } else if (oneByte == 234) { // Reader Programming - throw new ReaderException("Currently not supporting Reader Programming"); + throw ReaderException.getInstance(); } else if (oneByte == 235) { // Upper Shift (shift to Extended ASCII) upperShift = true; } else if (oneByte == 236) { // 05 Macro @@ -162,9 +162,9 @@ final class DecodedBitStreamParser { return EDIFACT_ENCODE; } else if (oneByte == 241) { // ECI Character // TODO(bbrown): I think we need to support ECI - throw new ReaderException("Currently not supporting ECI Character"); + throw ReaderException.getInstance(); } else if (oneByte >= 242) { // Not to be used in ASCII encodation - throw new ReaderException(oneByte + " should not be used in ASCII encodation"); + throw ReaderException.getInstance(); } } while (bits.available() > 0); return ASCII_ENCODE; @@ -226,11 +226,11 @@ final class DecodedBitStreamParser { result.append(C40_SHIFT2_SET_CHARS[cValue]); } } else if (cValue == 27) { // FNC1 - throw new ReaderException("Currently not supporting FNC1"); + throw ReaderException.getInstance(); } else if (cValue == 30) { // Upper Shift upperShift = true; } else { - throw new ReaderException(cValue + " is not valid in the C40 Shift 2 set"); + throw ReaderException.getInstance(); } shift = 0; break; @@ -244,7 +244,7 @@ final class DecodedBitStreamParser { shift = 0; break; default: - throw new ReaderException("Invalid shift value"); + throw ReaderException.getInstance(); } } } while (bits.available() > 0); @@ -307,11 +307,11 @@ final class DecodedBitStreamParser { result.append(C40_SHIFT2_SET_CHARS[cValue]); } } else if (cValue == 27) { // FNC1 - throw new ReaderException("Currently not supporting FNC1"); + throw ReaderException.getInstance(); } else if (cValue == 30) { // Upper Shift upperShift = true; } else { - throw new ReaderException(cValue + " is not valid in the C40 Shift 2 set"); + throw ReaderException.getInstance(); } shift = 0; break; @@ -325,7 +325,7 @@ final class DecodedBitStreamParser { shift = 0; break; default: - throw new ReaderException("Invalid shift value"); + throw ReaderException.getInstance(); } } } while (bits.available() > 0); @@ -366,7 +366,7 @@ final class DecodedBitStreamParser { } else if (cValue < 40) { // A - Z result.append((char) (cValue + 51)); } else { - throw new ReaderException(cValue + " is not valid in the ANSI X12 set"); + throw ReaderException.getInstance(); } } } while (bits.available() > 0); diff --git a/core/src/com/google/zxing/datamatrix/decoder/Decoder.java b/core/src/com/google/zxing/datamatrix/decoder/Decoder.java index 5ec86d286..ac83bab90 100644 --- a/core/src/com/google/zxing/datamatrix/decoder/Decoder.java +++ b/core/src/com/google/zxing/datamatrix/decoder/Decoder.java @@ -119,7 +119,7 @@ public final class Decoder { try { rsDecoder.decode(codewordsInts, numECCodewords); } catch (ReedSolomonException rse) { - throw new ReaderException(rse.toString()); + throw ReaderException.getInstance(); } // Copy back into array of bytes -- only need to worry about the bytes that were data // We don't care about errors in the error-correction codewords diff --git a/core/src/com/google/zxing/datamatrix/decoder/Version.java b/core/src/com/google/zxing/datamatrix/decoder/Version.java index 4918dfa43..0fff9409d 100644 --- a/core/src/com/google/zxing/datamatrix/decoder/Version.java +++ b/core/src/com/google/zxing/datamatrix/decoder/Version.java @@ -98,7 +98,7 @@ public final class Version { */ public static Version getVersionForDimensions(int numRows, int numColumns) throws ReaderException { if ((numRows & 0x01) != 0 || (numColumns & 0x01) != 0) { - throw new ReaderException("Dimension must be 0 mod 2"); + throw ReaderException.getInstance(); } // TODO(bbrown): This is doing a linear search through the array of versions. @@ -112,7 +112,7 @@ public final class Version { } } - throw new ReaderException("Dimensions do not correspond to a valid Data Matrix Version."); + throw ReaderException.getInstance(); } /** diff --git a/core/src/com/google/zxing/datamatrix/detector/Detector.java b/core/src/com/google/zxing/datamatrix/detector/Detector.java index 4de609843..f120c36f7 100644 --- a/core/src/com/google/zxing/datamatrix/detector/Detector.java +++ b/core/src/com/google/zxing/datamatrix/detector/Detector.java @@ -130,7 +130,7 @@ public final class Detector { } if (maybeTopLeft == null || bottomLeft == null || maybeBottomRight == null) { - throw new ReaderException("Could not find three corners"); + throw ReaderException.getInstance(); } // Bottom left is correct but top left and bottom right might be switched @@ -212,7 +212,7 @@ public final class Detector { } if (range == null) { if (lastRange == null) { - throw new ReaderException("Center of image not within barcode"); + throw ReaderException.getInstance(); } // lastRange was found if (dj == 0) { @@ -240,7 +240,7 @@ public final class Detector { } lastRange = range; } - throw new ReaderException("Couldn't find an end to barcode"); + throw ReaderException.getInstance(); } /** diff --git a/core/src/com/google/zxing/oned/AbstractOneDReader.java b/core/src/com/google/zxing/oned/AbstractOneDReader.java index f7b9ced49..7506db5d3 100644 --- a/core/src/com/google/zxing/oned/AbstractOneDReader.java +++ b/core/src/com/google/zxing/oned/AbstractOneDReader.java @@ -140,7 +140,7 @@ public abstract class AbstractOneDReader implements OneDReader { } } - throw new ReaderException("No barcode found"); + throw ReaderException.getInstance(); } /** @@ -162,7 +162,7 @@ public abstract class AbstractOneDReader implements OneDReader { } int end = row.getSize(); if (start >= end) { - throw new ReaderException("Couldn't fully read a pattern"); + throw ReaderException.getInstance(); } boolean isWhite = !row.get(start); int counterPosition = 0; @@ -185,7 +185,7 @@ public abstract class AbstractOneDReader implements OneDReader { // If we read fully the last section of pixels and filled up our counters -- or filled // the last counter but ran off the side of the image, OK. Otherwise, a problem. if (!(counterPosition == numCounters || (counterPosition == numCounters - 1 && i == end))) { - throw new ReaderException("Couldn't fully read a pattern"); + throw ReaderException.getInstance(); } } diff --git a/core/src/com/google/zxing/oned/AbstractUPCEANReader.java b/core/src/com/google/zxing/oned/AbstractUPCEANReader.java index 83aa7c09f..ee38c8280 100644 --- a/core/src/com/google/zxing/oned/AbstractUPCEANReader.java +++ b/core/src/com/google/zxing/oned/AbstractUPCEANReader.java @@ -124,12 +124,12 @@ public abstract class AbstractUPCEANReader extends AbstractOneDReader implements int end = endRange[1]; int quietEnd = end + (end - endRange[0]); if (quietEnd >= row.getSize() || !row.isRange(end, quietEnd, false)) { - throw new ReaderException("Pattern not followed by whitespace"); + throw ReaderException.getInstance(); } String resultString = result.toString(); if (!checkChecksum(resultString)) { - throw new ReaderException("Checksum failed"); + throw ReaderException.getInstance(); } float left = (float) (startGuardRange[1] + startGuardRange[0]) / 2.0f; @@ -162,7 +162,7 @@ public abstract class AbstractUPCEANReader extends AbstractOneDReader implements for (int i = length - 2; i >= 0; i -= 2) { int digit = (int) s.charAt(i) - (int) '0'; if (digit < 0 || digit > 9) { - throw new ReaderException("Illegal character during checksum"); + throw ReaderException.getInstance(); } sum += digit; } @@ -170,7 +170,7 @@ public abstract class AbstractUPCEANReader extends AbstractOneDReader implements for (int i = length - 1; i >= 0; i -= 2) { int digit = (int) s.charAt(i) - (int) '0'; if (digit < 0 || digit > 9) { - throw new ReaderException("Illegal character during checksum"); + throw ReaderException.getInstance(); } sum += digit; } @@ -242,7 +242,7 @@ public abstract class AbstractUPCEANReader extends AbstractOneDReader implements isWhite = !isWhite; } } - throw new ReaderException("Can't find pattern"); + throw ReaderException.getInstance(); } /** @@ -274,7 +274,7 @@ public abstract class AbstractUPCEANReader extends AbstractOneDReader implements if (bestMatch >= 0) { return bestMatch; } else { - throw new ReaderException("Could not match any digit in pattern"); + throw ReaderException.getInstance(); } } diff --git a/core/src/com/google/zxing/oned/Code128Reader.java b/core/src/com/google/zxing/oned/Code128Reader.java index 61488ba41..75be5607a 100644 --- a/core/src/com/google/zxing/oned/Code128Reader.java +++ b/core/src/com/google/zxing/oned/Code128Reader.java @@ -213,7 +213,7 @@ public final class Code128Reader extends AbstractOneDReader { isWhite = !isWhite; } } - throw new ReaderException("Can't find pattern"); + throw ReaderException.getInstance(); } private static int decodeCode(BitArray row, int[] counters, int rowOffset) throws ReaderException { @@ -232,7 +232,7 @@ public final class Code128Reader extends AbstractOneDReader { if (bestMatch >= 0) { return bestMatch; } else { - throw new ReaderException("Could not match any code pattern"); + throw ReaderException.getInstance(); } } @@ -252,7 +252,7 @@ public final class Code128Reader extends AbstractOneDReader { codeSet = CODE_CODE_C; break; default: - throw new ReaderException("Illegal start code"); + throw ReaderException.getInstance(); } boolean done = false; @@ -302,7 +302,7 @@ public final class Code128Reader extends AbstractOneDReader { case CODE_START_A: case CODE_START_B: case CODE_START_C: - throw new ReaderException("Unexpected start code"); + throw ReaderException.getInstance(); } switch (codeSet) { @@ -423,14 +423,14 @@ public final class Code128Reader extends AbstractOneDReader { nextStart++; } if (!row.isRange(nextStart, Math.min(row.getSize(), nextStart + (nextStart - lastStart) / 2), false)) { - throw new ReaderException("Pattern not followed by whitespace"); + throw ReaderException.getInstance(); } // Pull out from sum the value of the penultimate check code checksumTotal -= multiplier * lastCode; // lastCode is the checksum then: if (checksumTotal % 103 != lastCode) { - throw new ReaderException("Checksum failed"); + throw ReaderException.getInstance(); } // Need to pull out the check digits from string @@ -449,7 +449,7 @@ public final class Code128Reader extends AbstractOneDReader { if (resultString.length() == 0) { // Almost surely a false positive - throw new ReaderException("Empty barcode found; assuming a false positive"); + throw ReaderException.getInstance(); } float left = (float) (startPatternInfo[1] + startPatternInfo[0]) / 2.0f; diff --git a/core/src/com/google/zxing/oned/Code39Reader.java b/core/src/com/google/zxing/oned/Code39Reader.java index 3d54a6ed3..50f25091e 100644 --- a/core/src/com/google/zxing/oned/Code39Reader.java +++ b/core/src/com/google/zxing/oned/Code39Reader.java @@ -129,7 +129,7 @@ public final class Code39Reader extends AbstractOneDReader { // If 50% of last pattern size, following last pattern, is not whitespace, fail // (but if it's whitespace to the very end of the image, that's OK) if (nextStart != end && whiteSpaceAfterEnd / 2 < lastPatternSize) { - throw new ReaderException("Pattern not followed by whitespace"); + throw ReaderException.getInstance(); } if (usingCheckDigit) { @@ -139,7 +139,7 @@ public final class Code39Reader extends AbstractOneDReader { total += ALPHABET_STRING.indexOf(result.charAt(i)); } if (total % 43 != ALPHABET_STRING.indexOf(result.charAt(max))) { - throw new ReaderException("Checksum failed"); + throw ReaderException.getInstance(); } result.deleteCharAt(max); } @@ -151,7 +151,7 @@ public final class Code39Reader extends AbstractOneDReader { if (resultString.length() == 0) { // Almost surely a false positive - throw new ReaderException("Empty barcode found; assuming a false positive"); + throw ReaderException.getInstance(); } float left = (float) (start[1] + start[0]) / 2.0f; @@ -212,7 +212,7 @@ public final class Code39Reader extends AbstractOneDReader { isWhite = !isWhite; } } - throw new ReaderException("Can't find pattern"); + throw ReaderException.getInstance(); } private static int toNarrowWidePattern(int[] counters) throws ReaderException { @@ -249,14 +249,14 @@ public final class Code39Reader extends AbstractOneDReader { wideCounters--; // totalWideCountersWidth = 3 * average, so this checks if counter >= 3/2 * average if ((counter << 1) >= totalWideCountersWidth) { - throw new ReaderException("Wide bars vary too much in width, rejecting"); + throw ReaderException.getInstance(); } } } return pattern; } } while (wideCounters > 3); - throw new ReaderException("Can't find 3 wide bars/spaces out of 9"); + throw ReaderException.getInstance(); } private static char patternToChar(int pattern) throws ReaderException { @@ -265,7 +265,7 @@ public final class Code39Reader extends AbstractOneDReader { return ALPHABET[i]; } } - throw new ReaderException("Pattern did not match character encoding"); + throw ReaderException.getInstance(); } private static String decodeExtended(String encoded) throws ReaderException { @@ -282,7 +282,7 @@ public final class Code39Reader extends AbstractOneDReader { if (next >= 'A' && next <= 'Z') { decodedChar = (char) (next + 32); } else { - throw new ReaderException("Invalid extended code 39 sequence: " + c + next); + throw ReaderException.getInstance(); } break; case '$': @@ -290,7 +290,7 @@ public final class Code39Reader extends AbstractOneDReader { if (next >= 'A' && next <= 'Z') { decodedChar = (char) (next - 64); } else { - throw new ReaderException("Invalid extended code 39 sequence: " + c + next); + throw ReaderException.getInstance(); } break; case '%': @@ -300,7 +300,7 @@ public final class Code39Reader extends AbstractOneDReader { } else if (next >= 'F' && next <= 'W') { decodedChar = (char) (next - 11); } else { - throw new ReaderException("Invalid extended code 39 sequence: " + c + next); + throw ReaderException.getInstance(); } break; case '/': @@ -310,7 +310,7 @@ public final class Code39Reader extends AbstractOneDReader { } else if (next == 'Z') { decodedChar = ':'; } else { - throw new ReaderException("Invalid extended sequence: " + c + next); + throw ReaderException.getInstance(); } break; } diff --git a/core/src/com/google/zxing/oned/EAN13Reader.java b/core/src/com/google/zxing/oned/EAN13Reader.java index 4f36ce5b7..d948aced0 100644 --- a/core/src/com/google/zxing/oned/EAN13Reader.java +++ b/core/src/com/google/zxing/oned/EAN13Reader.java @@ -126,7 +126,7 @@ public final class EAN13Reader extends AbstractUPCEANReader { return; } } - throw new ReaderException("Unable to determine first digit"); + throw ReaderException.getInstance(); } } \ No newline at end of file diff --git a/core/src/com/google/zxing/oned/MultiFormatOneDReader.java b/core/src/com/google/zxing/oned/MultiFormatOneDReader.java index 8cb3bba5b..6386ac80b 100644 --- a/core/src/com/google/zxing/oned/MultiFormatOneDReader.java +++ b/core/src/com/google/zxing/oned/MultiFormatOneDReader.java @@ -68,7 +68,7 @@ public final class MultiFormatOneDReader extends AbstractOneDReader { } } - throw new ReaderException("No barcode was detected in this image."); + throw ReaderException.getInstance(); } } diff --git a/core/src/com/google/zxing/oned/MultiFormatUPCEANReader.java b/core/src/com/google/zxing/oned/MultiFormatUPCEANReader.java index 4c4979e3a..03b053793 100644 --- a/core/src/com/google/zxing/oned/MultiFormatUPCEANReader.java +++ b/core/src/com/google/zxing/oned/MultiFormatUPCEANReader.java @@ -88,7 +88,7 @@ public final class MultiFormatUPCEANReader extends AbstractOneDReader { return result; } - throw new ReaderException("No barcode was detected in this image."); + throw ReaderException.getInstance(); } } diff --git a/core/src/com/google/zxing/oned/UPCAReader.java b/core/src/com/google/zxing/oned/UPCAReader.java index 472ba14a6..634e51862 100644 --- a/core/src/com/google/zxing/oned/UPCAReader.java +++ b/core/src/com/google/zxing/oned/UPCAReader.java @@ -55,7 +55,7 @@ public final class UPCAReader implements UPCEANReader { if (text.charAt(0) == '0') { return new Result(text.substring(1), null, result.getResultPoints(), BarcodeFormat.UPC_A); } else { - throw new ReaderException("Found EAN-13 code but was not a UPC-A code"); + throw ReaderException.getInstance(); } } diff --git a/core/src/com/google/zxing/oned/UPCEReader.java b/core/src/com/google/zxing/oned/UPCEReader.java index 35eb3e683..f8b885aa6 100644 --- a/core/src/com/google/zxing/oned/UPCEReader.java +++ b/core/src/com/google/zxing/oned/UPCEReader.java @@ -99,7 +99,7 @@ public final class UPCEReader extends AbstractUPCEANReader { } } } - throw new ReaderException("Unable to determine number system and check digit"); + throw ReaderException.getInstance(); } BarcodeFormat getBarcodeFormat() { diff --git a/core/src/com/google/zxing/qrcode/QRCodeReader.java b/core/src/com/google/zxing/qrcode/QRCodeReader.java index 3bef7aa67..a8252301c 100644 --- a/core/src/com/google/zxing/qrcode/QRCodeReader.java +++ b/core/src/com/google/zxing/qrcode/QRCodeReader.java @@ -93,7 +93,7 @@ public final class QRCodeReader implements Reader { borderWidth++; } if (borderWidth == minDimension) { - throw new ReaderException("No black pixels found along diagonal"); + throw ReaderException.getInstance(); } // And then keep tracking across the top-left black module to determine module size @@ -102,7 +102,7 @@ public final class QRCodeReader implements Reader { moduleEnd++; } if (moduleEnd == minDimension) { - throw new ReaderException("No end to black pixels found along diagonal"); + throw ReaderException.getInstance(); } int moduleSize = moduleEnd - borderWidth; @@ -113,14 +113,13 @@ public final class QRCodeReader implements Reader { rowEndOfSymbol--; } if (rowEndOfSymbol < 0) { - throw new ReaderException("Can't find end of rightmost black module"); + throw ReaderException.getInstance(); } rowEndOfSymbol++; // Make sure width of barcode is a multiple of module size if ((rowEndOfSymbol - borderWidth) % moduleSize != 0) { - throw new ReaderException("Bad module size / width: " + moduleSize + - " / " + (rowEndOfSymbol - borderWidth)); + throw ReaderException.getInstance(); } int dimension = (rowEndOfSymbol - borderWidth) / moduleSize; @@ -131,7 +130,7 @@ public final class QRCodeReader implements Reader { int sampleDimension = borderWidth + (dimension - 1) * moduleSize; if (sampleDimension >= width || sampleDimension >= height) { - throw new ReaderException("Estimated pure image size is beyond image boundaries"); + throw ReaderException.getInstance(); } // Now just read off the bits diff --git a/core/src/com/google/zxing/qrcode/decoder/BitMatrixParser.java b/core/src/com/google/zxing/qrcode/decoder/BitMatrixParser.java index b375f27d3..8e1ff46b9 100644 --- a/core/src/com/google/zxing/qrcode/decoder/BitMatrixParser.java +++ b/core/src/com/google/zxing/qrcode/decoder/BitMatrixParser.java @@ -35,7 +35,7 @@ final class BitMatrixParser { BitMatrixParser(BitMatrix bitMatrix) throws ReaderException { int dimension = bitMatrix.getDimension(); if (dimension < 21 || (dimension & 0x03) != 1) { - throw new ReaderException("Dimension must be 1 mod 4 and >= 21"); + throw ReaderException.getInstance(); } this.bitMatrix = bitMatrix; } @@ -87,7 +87,7 @@ final class BitMatrixParser { if (parsedFormatInfo != null) { return parsedFormatInfo; } - throw new ReaderException("Could not decode format information"); + throw ReaderException.getInstance(); } /** @@ -137,7 +137,7 @@ final class BitMatrixParser { if (parsedVersion != null) { return parsedVersion; } - throw new ReaderException("Could not decode version"); + throw ReaderException.getInstance(); } private int copyBit(int i, int j, int versionBits) { @@ -201,7 +201,7 @@ final class BitMatrixParser { readingUp = !readingUp; // switch directions } if (resultOffset != version.getTotalCodewords()) { - throw new ReaderException("Did not read all codewords"); + throw ReaderException.getInstance(); } return result; } diff --git a/core/src/com/google/zxing/qrcode/decoder/DecodedBitStreamParser.java b/core/src/com/google/zxing/qrcode/decoder/DecodedBitStreamParser.java index 8734fafc4..917a7ff17 100644 --- a/core/src/com/google/zxing/qrcode/decoder/DecodedBitStreamParser.java +++ b/core/src/com/google/zxing/qrcode/decoder/DecodedBitStreamParser.java @@ -96,7 +96,7 @@ final class DecodedBitStreamParser { } else if (mode.equals(Mode.KANJI)) { decodeKanjiSegment(bits, result, count); } else { - throw new ReaderException("Unsupported mode indicator"); + throw ReaderException.getInstance(); } } } @@ -132,7 +132,7 @@ final class DecodedBitStreamParser { try { result.append(new String(buffer, SHIFT_JIS)); } catch (UnsupportedEncodingException uee) { - throw new ReaderException(SHIFT_JIS + " encoding is not supported on this device"); + throw ReaderException.getInstance(); } } @@ -143,7 +143,7 @@ final class DecodedBitStreamParser { Vector byteSegments) throws ReaderException { byte[] readBytes = new byte[count]; if (count << 3 > bits.available()) { - throw new ReaderException("Count too large: " + count); + throw ReaderException.getInstance(); } for (int i = 0; i < count; i++) { readBytes[i] = (byte) bits.readBits(8); @@ -162,7 +162,7 @@ final class DecodedBitStreamParser { try { result.append(new String(readBytes, encoding)); } catch (UnsupportedEncodingException uce) { - throw new ReaderException(uce.toString()); + throw ReaderException.getInstance(); } byteSegments.addElement(readBytes); } @@ -208,7 +208,7 @@ final class DecodedBitStreamParser { // Each 10 bits encodes three digits int threeDigitsBits = bits.readBits(10); if (threeDigitsBits >= 1000) { - throw new ReaderException("Illegal value for 3-digit unit: " + threeDigitsBits); + throw ReaderException.getInstance(); } result.append(ALPHANUMERIC_CHARS[threeDigitsBits / 100]); result.append(ALPHANUMERIC_CHARS[(threeDigitsBits / 10) % 10]); @@ -219,7 +219,7 @@ final class DecodedBitStreamParser { // Two digits left over to read, encoded in 7 bits int twoDigitsBits = bits.readBits(7); if (twoDigitsBits >= 100) { - throw new ReaderException("Illegal value for 2-digit unit: " + twoDigitsBits); + throw ReaderException.getInstance(); } result.append(ALPHANUMERIC_CHARS[twoDigitsBits / 10]); result.append(ALPHANUMERIC_CHARS[twoDigitsBits % 10]); @@ -227,7 +227,7 @@ final class DecodedBitStreamParser { // One digit left over to read int digitBits = bits.readBits(4); if (digitBits >= 10) { - throw new ReaderException("Illegal value for digit unit: " + digitBits); + throw ReaderException.getInstance(); } result.append(ALPHANUMERIC_CHARS[digitBits]); } diff --git a/core/src/com/google/zxing/qrcode/decoder/Decoder.java b/core/src/com/google/zxing/qrcode/decoder/Decoder.java index e1f34bcd8..b25d84d19 100644 --- a/core/src/com/google/zxing/qrcode/decoder/Decoder.java +++ b/core/src/com/google/zxing/qrcode/decoder/Decoder.java @@ -119,7 +119,7 @@ public final class Decoder { try { rsDecoder.decode(codewordsInts, numECCodewords); } catch (ReedSolomonException rse) { - throw new ReaderException(rse.toString()); + throw ReaderException.getInstance(); } // Copy back into array of bytes -- only need to worry about the bytes that were data // We don't care about errors in the error-correction codewords diff --git a/core/src/com/google/zxing/qrcode/decoder/ErrorCorrectionLevel.java b/core/src/com/google/zxing/qrcode/decoder/ErrorCorrectionLevel.java index 27a94d31d..3826bc439 100644 --- a/core/src/com/google/zxing/qrcode/decoder/ErrorCorrectionLevel.java +++ b/core/src/com/google/zxing/qrcode/decoder/ErrorCorrectionLevel.java @@ -63,7 +63,7 @@ final class ErrorCorrectionLevel { */ static ErrorCorrectionLevel forBits(int bits) throws ReaderException { if (bits < 0 || bits >= FOR_BITS.length) { - throw new ReaderException("Illegal error correction level bits" + bits); + throw ReaderException.getInstance(); } return FOR_BITS[bits]; } diff --git a/core/src/com/google/zxing/qrcode/decoder/Mode.java b/core/src/com/google/zxing/qrcode/decoder/Mode.java index 417a0ddc0..450642311 100644 --- a/core/src/com/google/zxing/qrcode/decoder/Mode.java +++ b/core/src/com/google/zxing/qrcode/decoder/Mode.java @@ -67,7 +67,7 @@ final class Mode { case 0x9: return FNC1_SECOND_POSITION; default: - throw new ReaderException("Unsupported mode bits: " + bits); + throw ReaderException.getInstance(); } } diff --git a/core/src/com/google/zxing/qrcode/decoder/Version.java b/core/src/com/google/zxing/qrcode/decoder/Version.java index 63273b68f..a2e39fbf7 100755 --- a/core/src/com/google/zxing/qrcode/decoder/Version.java +++ b/core/src/com/google/zxing/qrcode/decoder/Version.java @@ -95,14 +95,14 @@ public final class Version { */ public static Version getProvisionalVersionForDimension(int dimension) throws ReaderException { if (dimension % 4 != 1) { - throw new ReaderException("Dimension must be 1 mod 4"); + throw ReaderException.getInstance(); } return getVersionForNumber((dimension - 17) >> 2); } public static Version getVersionForNumber(int versionNumber) throws ReaderException { if (versionNumber < 1 || versionNumber > 40) { - throw new ReaderException("versionNumber must be between 1 and 40"); + throw ReaderException.getInstance(); } return VERSIONS[versionNumber - 1]; } diff --git a/core/src/com/google/zxing/qrcode/detector/AlignmentPatternFinder.java b/core/src/com/google/zxing/qrcode/detector/AlignmentPatternFinder.java index 66cbadb50..52e7896ef 100644 --- a/core/src/com/google/zxing/qrcode/detector/AlignmentPatternFinder.java +++ b/core/src/com/google/zxing/qrcode/detector/AlignmentPatternFinder.java @@ -148,7 +148,7 @@ final class AlignmentPatternFinder { return (AlignmentPattern) possibleCenters.elementAt(0); } - throw new ReaderException("Could not find alignment pattern"); + throw ReaderException.getInstance(); } /** diff --git a/core/src/com/google/zxing/qrcode/detector/Detector.java b/core/src/com/google/zxing/qrcode/detector/Detector.java index 5739d9d08..a2aabdd84 100644 --- a/core/src/com/google/zxing/qrcode/detector/Detector.java +++ b/core/src/com/google/zxing/qrcode/detector/Detector.java @@ -75,7 +75,7 @@ public final class Detector { float moduleSize = calculateModuleSize(topLeft, topRight, bottomLeft); if (moduleSize < 1.0f) { - throw new ReaderException("Module size too small"); + throw ReaderException.getInstance(); } int dimension = computeDimension(topLeft, topRight, bottomLeft, moduleSize); Version provisionalVersion = Version.getProvisionalVersionForDimension(dimension); @@ -108,7 +108,7 @@ public final class Detector { } } if (alignmentPattern == null) { - throw new ReaderException("Could not find alignment pattern"); + throw ReaderException.getInstance(); } } @@ -188,7 +188,7 @@ public final class Detector { dimension--; break; case 3: - throw new ReaderException("Bad dimension: " + dimension); + throw ReaderException.getInstance(); } return dimension; } @@ -335,7 +335,7 @@ public final class Detector { int alignmentAreaLeftX = Math.max(0, estAlignmentX - allowance); int alignmentAreaRightX = Math.min(image.getWidth() - 1, estAlignmentX + allowance); if (alignmentAreaRightX - alignmentAreaLeftX < overallEstModuleSize * 3) { - throw new ReaderException("Alignment pattern is too small to search"); + throw ReaderException.getInstance(); } int alignmentAreaTopY = Math.max(0, estAlignmentY - allowance); diff --git a/core/src/com/google/zxing/qrcode/detector/FinderPatternFinder.java b/core/src/com/google/zxing/qrcode/detector/FinderPatternFinder.java index 8841c1bea..a51863104 100755 --- a/core/src/com/google/zxing/qrcode/detector/FinderPatternFinder.java +++ b/core/src/com/google/zxing/qrcode/detector/FinderPatternFinder.java @@ -484,7 +484,7 @@ final class FinderPatternFinder { if (size < 3) { // Couldn't find enough finder patterns - throw new ReaderException("Could not find three finder patterns"); + throw ReaderException.getInstance(); } if (size > 3) {