diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest1d5.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest1d5.java
index 35b1434..bda9c3b 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest1d5.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest1d5.java
@@ -14,7 +14,10 @@
 package org.eclipse.jdt.ui.tests.quickfix;
 
 import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.fail;
 
+import java.io.PrintWriter;
+import java.io.StringWriter;
 import java.util.Arrays;
 import java.util.HashSet;
 
@@ -2858,6 +2861,71 @@
 	}
 
 	@Test
+	public void testUnnecessaryArray_default_package() throws Exception {
+		try {
+			// Given
+			IPackageFragment pack1= fSourceFolder.createPackageFragment("", false, null);
+			String given= "" //
+					+ "public class A {\n" //
+					+ "    public class B {\n" //
+					+ "        public void foo(Object elementsOrTreePaths, Integer obj, Integer obj2) {\n" //
+					+ "            return;\n" //
+					+ "        }\n" //
+					+ "    }\n" //
+					+ "\n" //
+					+ "    public class C extends B {\n" //
+					+ "        public void foo(Object... elementsOrTreePaths) {\n" //
+					+ "            return;\n" //
+					+ "        }\n" //
+					+ "\n" //
+					+ "        public void foo(Object elementsOrTreePaths, Integer obj) {\n" //
+					+ "            foo(new Object[] {elementsOrTreePaths, obj});\n" //
+					+ "            foo(new Object[] {elementsOrTreePaths, elementsOrTreePaths});\n" //
+					+ "            foo(new Object[] {elementsOrTreePaths, obj, obj});\n" //
+					+ "            foo(new Object[] {elementsOrTreePaths, obj, elementsOrTreePaths});\n" //
+					+ "        }\n" //
+					+ "    }\n" //
+					+ "}\n";
+
+			String expected= "" //
+					+ "public class A {\n" //
+					+ "    public class B {\n" //
+					+ "        public void foo(Object elementsOrTreePaths, Integer obj, Integer obj2) {\n" //
+					+ "            return;\n" //
+					+ "        }\n" //
+					+ "    }\n" //
+					+ "\n" //
+					+ "    public class C extends B {\n" //
+					+ "        public void foo(Object... elementsOrTreePaths) {\n" //
+					+ "            return;\n" //
+					+ "        }\n" //
+					+ "\n" //
+					+ "        public void foo(Object elementsOrTreePaths, Integer obj) {\n" //
+					+ "            foo(new Object[] {elementsOrTreePaths, obj});\n" //
+					+ "            foo(elementsOrTreePaths, elementsOrTreePaths);\n" //
+					+ "            foo(new Object[] {elementsOrTreePaths, obj, obj});\n" //
+					+ "            foo(elementsOrTreePaths, obj, elementsOrTreePaths);\n" //
+					+ "        }\n" //
+					+ "    }\n" //
+					+ "}\n";
+
+			// When
+			ICompilationUnit cu= pack1.createCompilationUnit("A.java", given, false, null);
+			enable(CleanUpConstants.REMOVE_UNNECESSARY_ARRAY_CREATION);
+
+			// Then
+			assertNotEquals("The class must be changed", given, expected);
+			assertRefactoringResultAsExpected(new ICompilationUnit[] { cu }, new String[] { expected },
+					new HashSet<>(Arrays.asList(FixMessages.UnusedCodeFix_RemoveUnnecessaryArrayCreation_description)));
+		} catch (Exception e) {
+            StringWriter sw = new StringWriter();
+            PrintWriter pw = new PrintWriter(sw);
+            e.printStackTrace(pw);
+            fail(sw.toString());
+		}
+	}
+
+	@Test
 	public void testUnnecessaryEmptyArray() throws Exception {
 		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
 		String sample= "" //
diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/UnnecessaryArrayCreationFix.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/UnnecessaryArrayCreationFix.java
index c61ea19..b8b68d5 100644
--- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/UnnecessaryArrayCreationFix.java
+++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/UnnecessaryArrayCreationFix.java
@@ -163,7 +163,11 @@
 					if (root instanceof CompilationUnit) {
 						CompilationUnit compilationUnit= (CompilationUnit) root;
 						List<ImportDeclaration> imports= compilationUnit.imports();
-						String localPackage= compilationUnit.getPackage().getName().getFullyQualifiedName();
+						String localPackage= null;
+
+						if (compilationUnit.getPackage() != null && compilationUnit.getPackage().getName() != null) {
+							localPackage= compilationUnit.getPackage().getName().getFullyQualifiedName();
+						}
 
 						for (ImportDeclaration oneImport : imports) {
 							if (oneImport.isStatic()
@@ -173,11 +177,16 @@
 								String methodIdentifier= methodName.getName().getIdentifier();
 								ITypeBinding conflictingType= methodName.getQualifier().resolveTypeBinding();
 
-								if (conflictingType == null || conflictingType.getPackage() == null) {
+								if (conflictingType == null) {
 									return true; // Error on side of caution
 								}
 
-								String importPackage= conflictingType.getPackage().getName();
+								String importPackage= null;
+
+								if (conflictingType.getPackage() != null) {
+									importPackage= conflictingType.getPackage().getName();
+								}
+
 								boolean inSamePackage= Objects.equals(localPackage, importPackage);
 
 								for (IMethodBinding declaredMethod : conflictingType.getDeclaredMethods()) {
