move to singleton ReaderException for a bit more performance

git-svn-id: https://zxing.googlecode.com/svn/trunk@714 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
srowen 2008-11-17 17:56:31 +00:00
parent 405aba0044
commit e9a29fb098
30 changed files with 108 additions and 104 deletions

View file

@ -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();
}
}

View file

@ -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

View file

@ -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

View file

@ -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;

View file

@ -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) {

View file

@ -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

View file

@ -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;
}

View file

@ -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);

View file

@ -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

View file

@ -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();
}
/**

View file

@ -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();
}
/**

View file

@ -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();
}
}

View file

@ -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();
}
}

View file

@ -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;

View file

@ -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;
}

View file

@ -126,7 +126,7 @@ public final class EAN13Reader extends AbstractUPCEANReader {
return;
}
}
throw new ReaderException("Unable to determine first digit");
throw ReaderException.getInstance();
}
}

View file

@ -68,7 +68,7 @@ public final class MultiFormatOneDReader extends AbstractOneDReader {
}
}
throw new ReaderException("No barcode was detected in this image.");
throw ReaderException.getInstance();
}
}

View file

@ -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();
}
}

View file

@ -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();
}
}

View file

@ -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() {

View file

@ -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

View file

@ -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;
}

View file

@ -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]);
}

View file

@ -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

View file

@ -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];
}

View file

@ -67,7 +67,7 @@ final class Mode {
case 0x9:
return FNC1_SECOND_POSITION;
default:
throw new ReaderException("Unsupported mode bits: " + bits);
throw ReaderException.getInstance();
}
}

View file

@ -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];
}

View file

@ -148,7 +148,7 @@ final class AlignmentPatternFinder {
return (AlignmentPattern) possibleCenters.elementAt(0);
}
throw new ReaderException("Could not find alignment pattern");
throw ReaderException.getInstance();
}
/**

View file

@ -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);

View file

@ -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) {