Disallow a null handler array.

Change-Id: Ib26da2d0595e725186d5cd3ad87fa10dd9a896a7
diff --git a/src/main/java/com/android/tools/r8/dex/DexParser.java b/src/main/java/com/android/tools/r8/dex/DexParser.java
index a416e51..978a7e7 100644
--- a/src/main/java/com/android/tools/r8/dex/DexParser.java
+++ b/src/main/java/com/android/tools/r8/dex/DexParser.java
@@ -859,7 +859,7 @@
     int insnsSize = dexReader.getUint();
     short[] code = new short[insnsSize];
     Try[] tries = new Try[triesSize];
-    DexCode.TryHandler[] handlers = null;
+    TryHandler[] handlers = new TryHandler[0];
 
     if (insnsSize != 0) {
       for (int i = 0; i < insnsSize; i++) {
diff --git a/src/main/java/com/android/tools/r8/dex/FileWriter.java b/src/main/java/com/android/tools/r8/dex/FileWriter.java
index d9103a5..bb5706d 100644
--- a/src/main/java/com/android/tools/r8/dex/FileWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/FileWriter.java
@@ -408,7 +408,7 @@
     }
     result += insnSize * 2;
     result += code.tries.length * 8;
-    if ((code.handlers != null) && (code.handlers.length > 0)) {
+    if (code.handlers.length > 0) {
       result = alignSize(4, result);
       result += LebUtils.sizeAsUleb128(code.handlers.length);
       for (TryHandler handler : code.handlers) {
diff --git a/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java b/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java
index e05af85..128ea1d 100644
--- a/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java
+++ b/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java
@@ -194,9 +194,6 @@
 
   private TryHandler[] rewriteHandlerOffsets() {
     DexCode code = method.getCode().asDexCode();
-    if (code.handlers == null) {
-      return null;
-    }
     TryHandler[] result = new TryHandler[code.handlers.length];
     for (int i = 0; i < code.handlers.length; i++) {
       TryHandler handler = code.handlers[i];
@@ -545,21 +542,19 @@
       tryRangeStartAndEndTargets.put(start.getOffset(), start);
       tryRangeStartAndEndTargets.put(end.getOffset(), end);
     }
-    if (code.handlers != null) {
-      for (TryHandler handler : code.handlers) {
-        List<Instruction> targets = new ArrayList<>();
-        if (handler.catchAllAddr != NO_HANDLER) {
-          Instruction target = offsetToInstruction.get(handler.catchAllAddr);
-          assert target != null;
-          targets.add(target);
-        }
-        for (TypeAddrPair pair : handler.pairs) {
-          Instruction target = offsetToInstruction.get(pair.addr);
-          assert target != null;
-          targets.add(target);
-        }
-        handlerTargets.put(handler, targets);
+    for (TryHandler handler : code.handlers) {
+      List<Instruction> targets = new ArrayList<>();
+      if (handler.catchAllAddr != NO_HANDLER) {
+        Instruction target = offsetToInstruction.get(handler.catchAllAddr);
+        assert target != null;
+        targets.add(target);
       }
+      for (TypeAddrPair pair : handler.pairs) {
+        Instruction target = offsetToInstruction.get(pair.addr);
+        assert target != null;
+        targets.add(target);
+      }
+      handlerTargets.put(handler, targets);
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/graph/DexCode.java b/src/main/java/com/android/tools/r8/graph/DexCode.java
index f9e4285..5ff8573 100644
--- a/src/main/java/com/android/tools/r8/graph/DexCode.java
+++ b/src/main/java/com/android/tools/r8/graph/DexCode.java
@@ -67,6 +67,9 @@
     this.tries = tries;
     this.handlers = handlers;
     this.debugInfo = debugInfo;
+    assert tries != null;
+    assert handlers != null;
+    assert instructions != null;
     hashCode();  // Cache the hash code eagerly.
   }
 
@@ -247,11 +250,9 @@
     for (Instruction insn : instructions) {
       insn.registerUse(registry);
     }
-    if (handlers != null) {
-      for (TryHandler handler : handlers) {
-        for (TypeAddrPair pair : handler.pairs) {
-          registry.registerTypeReference(pair.type);
-        }
+    for (TryHandler handler : handlers) {
+      for (TypeAddrPair pair : handler.pairs) {
+        registry.registerTypeReference(pair.type);
       }
     }
   }
@@ -318,14 +319,12 @@
         builder.append(atry.toString());
         builder.append('\n');
       }
-      if (handlers != null) {
-        builder.append("Handlers (numbers are offsets)\n");
-        for (int handlerIndex = 0; handlerIndex < handlers.length; handlerIndex++) {
-          TryHandler handler = handlers[handlerIndex];
-          builder.append("  ").append(handlerIndex).append(": ");
-          builder.append(handler.toString());
-          builder.append('\n');
-        }
+      builder.append("Handlers (numbers are offsets)\n");
+      for (int handlerIndex = 0; handlerIndex < handlers.length; handlerIndex++) {
+        TryHandler handler = handlers[handlerIndex];
+        builder.append("  ").append(handlerIndex).append(": ");
+        builder.append(handler.toString());
+        builder.append('\n');
       }
     }
     return builder.toString();
@@ -381,13 +380,11 @@
         builder.append(atry.toString());
         builder.append('\n');
       }
-      if (handlers != null) {
         builder.append("Handlers (numbers are offsets)\n");
         for (TryHandler handler : handlers) {
           builder.append(handler.toString());
           builder.append('\n');
         }
-      }
     }
     return builder.toString();
   }
@@ -410,11 +407,9 @@
     if (debugInfo != null) {
       getDebugInfoForWriting().collectIndexedItems(indexedItems, graphLens);
     }
-    if (handlers != null) {
       for (TryHandler handler : handlers) {
         handler.collectIndexedItems(indexedItems, graphLens);
       }
-    }
   }
 
   public DexDebugInfoForWriting getDebugInfoForWriting() {
diff --git a/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java b/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java
index 71d5ffb..c72cf47 100644
--- a/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java
+++ b/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java
@@ -20,6 +20,7 @@
 import com.android.tools.r8.graph.DexAnnotationSet;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexCode.Try;
+import com.android.tools.r8.graph.DexCode.TryHandler;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexString;
@@ -150,14 +151,7 @@
 
   private DexCode jumboStringProcess(
       DexItemFactory factory, DexString string, Instruction[] instructions) {
-    DexCode code = new DexCode(
-        1,
-        0,
-        0,
-        instructions,
-        new Try[0],
-        null,
-        null);
+    DexCode code = new DexCode(1, 0, 0, instructions, new Try[0], new TryHandler[0], null);
     MethodAccessFlags flags = MethodAccessFlags.fromSharedAccessFlags(Constants.ACC_PUBLIC, false);
     DexEncodedMethod method =
         new DexEncodedMethod(
diff --git a/src/test/java/com/android/tools/r8/regress/b111960171/B111960171.java b/src/test/java/com/android/tools/r8/regress/b111960171/B111960171.java
index 21d088f..d05520f 100644
--- a/src/test/java/com/android/tools/r8/regress/b111960171/B111960171.java
+++ b/src/test/java/com/android/tools/r8/regress/b111960171/B111960171.java
@@ -65,13 +65,13 @@
   public void disableDex2OatInliningWithTryCatch()
       throws IOException, CompilationFailedException, ExecutionException {
     MethodSubject method = compileTestClassAndGetMethod(AndroidApiLevel.M.getLevel());
-    assertTrue(method.getMethod().getCode().asDexCode().handlers != null);
+    assertTrue(method.getMethod().getCode().asDexCode().handlers.length > 0);
   }
 
   @Test
   public void dontDisableDex2OatInliningWithTryCatch()
       throws IOException, CompilationFailedException, ExecutionException {
     MethodSubject method = compileTestClassAndGetMethod(AndroidApiLevel.N.getLevel());
-    assertTrue(method.getMethod().getCode().asDexCode().handlers == null);
+    assertTrue(method.getMethod().getCode().asDexCode().handlers.length == 0);
   }
 }